[ad_1]
Nó bao gồm việc chuyển đổi trọng số từ FP16 sang INT8, về cơ bản là giảm một nửa kích thước của LLM. Phương pháp này tuyên bố có thể giảm hiệu quả kích thước của LLM lên đến 175B tham số mà không làm giảm hiệu suất.
Trước khi đi vào chi tiết của giấy (1), điều quan trọng là phải hiểu rằng LLM có đặc điểm mới nổi — các mẫu phát sinh từ dữ liệu đào tạo và rất quan trọng đối với hiệu suất của mô hình. Một số tính năng này có thể có độ lớn lớn và có thể ảnh hưởng mạnh đến hiệu suất tổng thể của mô hình.
Các bước thực hiện:
- Các LLM.int8() phương pháp bắt đầu bằng lượng tử hóa từng vectơ. Điều này có nghĩa là mỗi vectơ (một hàng trong ma trận) được lượng tử hóa riêng biệt, sử dụng hằng số chuẩn hóa riêng của nó. Do đó, ý nghĩa tương đối của từng tính năng được bảo toàn.
- Đối với mỗi vectơ, một hằng số chuẩn hóa được tính toán, được sử dụng để chia tỷ lệ các vectơ sao cho chúng có thể được biểu diễn dưới dạng số nguyên 8 bit. Bằng cách sử dụng các hằng số chuẩn hóa, hầu hết các tính năng trong LLM đều được lượng tử hóa.
- Đối với các giá trị ngoại lệ mới nổi — các đặc điểm có độ lớn bất thường — một lược đồ phân tích độ chính xác hỗn hợp được sử dụng. Điều này cô lập các đặc điểm ngoại lệ này thành một phép nhân ma trận 16 bit riêng biệt, đảm bảo chúng được xử lý chính xác trong khi vẫn cho phép hơn 99,9% giá trị được nhân trong 8 bit.
Ưu điểm
LLM có thể được lượng tử hóa và sử dụng ngay để suy luận mà không làm giảm hiệu suất.
Nhược điểm
Phương pháp này chỉ tập trung vào kiểu dữ liệu INT8 và các mô hình có tới 175B tham số (đặc biệt là OPT-175B / BLOOM).
Triển khai mã
from transformers import AutoTokenizer, AutoModelForCausalLM
import torchmodel_id = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model_8bit = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", load_in_8bit=True)
GPTQ (Tháng 10 năm 2022)
GPTQ là một kỹ thuật PTQ một lần đầu tiên cho phép triển khai hiệu quả các mô hình ngôn ngữ lớn. Nó đạt được chủ yếu thông qua hai tính năng được đề xuất trong giấy (4),
- Lượng tử hóa từng lớp
Lượng tử hóa được thực hiện từng lớp trong LLM. Mục tiêu là tìm ra phiên bản đơn giản hơn của trọng số mà vẫn mang lại cho chúng ta kết quả tốt khi chúng ta sử dụng nó để đưa ra dự đoán. Điều này được thực hiện theo cách mà sự khác biệt giữa trọng số ban đầu và trọng số đơn giản hóa là nhỏ nhất có thể – tức là, lỗi bình phương trung bình thấp nhất. - Lượng tử hóa não tối ưu
Đây là một thuật toán nhằm mục đích giảm thiểu lỗi phát sinh trong mô hình do lượng tử hóa. Trong khi lượng tử hóa một trọng số, các trọng số còn lại sẽ được điều chỉnh.
Ưu điểm
GPTQ cho phép lượng tử hóa lên đến 2 bit, cung cấp nhiều sự lựa chọn cân bằng giữa kích thước mô hình và hiệu suất.
Nhược điểm
Lượng tử hóa theo phương pháp này làm giảm hiệu suất đáng kể.
Triển khai mã
Cài đặt các thư viện cần thiết.
pip set up auto-gptq transformers speed up
Tải mô hình và lượng tử hóa nó với tự động gptq thư viện.
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quant_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)
mannequin = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quant_config)
QLoRA (Tháng 5 năm 2023)
Trước khi tìm hiểu sâu hơn về QLoRA, đây là phần giới thiệu ngắn gọn về LoRA. LoRA (Sự thích nghi cấp thấp của các mô hình ngôn ngữ lớn) là phương pháp tinh chỉnh hiệu quả tham số được sử dụng để chuyên biệt hóa LLM cho các nhiệm vụ cụ thể. Nó đạt được điều này bằng cách tích hợp các ma trận có thể đào tạo dựa trên phân tích thứ hạng vào mọi lớp biến áp. Hơn nữa, nó giảm thiểu số lượng tham số cần được đào tạo cho nhiệm vụ mục tiêu, trong khi vẫn duy trì trọng số mô hình được đào tạo trước ban đầu không thay đổi. Đọc thêm về nó đây.
QLoRA là phiên bản nâng cao của LoRA. Sau đây là những điểm nổi bật trong phương pháp này như được mô tả trong giấy (2):
1. Lượng tử hóa số thực chuẩn 4 bit:
Float bình thường 4 bit hoạt động bằng cách tính toán 2ᵏ+1 các phân vị (trong đó okay là số bit) trong phạm vi phân phối từ 0 đến 1, sau đó chuẩn hóa các giá trị này để phù hợp với khoảng (-1, 1). Với chuẩn hóa này, chúng ta cũng có thể điều chỉnh trọng số mạng nơ-ron của mình theo phạm vi (-1, 1) và tiến hành lượng tử hóa.
2. Sự mất lượng tử kép:
Điều này liên quan đến việc lượng tử hóa các hằng số lượng tử hóa được sử dụng trong quy trình lượng tử hóa NF 4 bit. Nó có thể bảo toàn trung bình 0,5 bit cho mỗi tham số. Điều này có lợi vì QLoRA sử dụng Lượng tử hóa k-bit theo khối.
3. Tối ưu hóa phân trang:
QLoRA liên quan đến việc chuyển trang hiệu quả từ GPU sang CPU bằng tính năng bộ nhớ hợp nhất của Nvidia. Điều này ngăn ngừa tình trạng quá tải GPU và giúp đào tạo hiệu quả mà không bị gián đoạn.
Ưu điểm
QLoRA, do sử dụng ít bộ nhớ GPU hơn, có thể hỗ trợ độ dài chuỗi tối đa cao hơn và số lượng lô lớn hơn.
Nhược điểm
Nó có thể chậm hơn về tốc độ điều chỉnh. Nó cũng đứng ở mức thấp hơn về hiệu quả chi phí nhưng đó không phải là vấn đề đáng lo ngại.
Triển khai mã
Cài đặt các thư viện cần thiết
pip set up -q -U trl transformers speed up git+https://github.com/huggingface/peft.git
pip set up -q datasets bitsandbytes
Tải mô hình và bộ mã hóa. Cấu hình các tham số LoRA.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, AutoTokenizermodel_id = "meta-llama/Llama-2-7b-chat-hf"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
mannequin = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
trust_remote_code=True
)
mannequin.config.use_cache = False
from peft import LoraConfig, get_peft_model
lora_alpha = 16
lora_dropout = 0.1
lora_r = 64
peft_config = LoraConfig(
lora_alpha=lora_alpha,
lora_dropout=lora_dropout,
r=lora_r,
task_type="CAUSAL_LM"
)
Thiết lập trình huấn luyện bằng cách sử dụng SFTTrainer
từ thư viện TRL cung cấp một wrapper xung quanh máy biến áp Coach
để dễ dàng tinh chỉnh các mô hình trên các tập dữ liệu dựa trên hướng dẫn bằng cách sử dụng bộ điều hợp PEFT. Tất nhiên, bạn sẽ cần một tập dữ liệu để đào tạo.
from transformers import TrainingArgumentsoutput_dir = "./fashions"
per_device_train_batch_size = 4
gradient_accumulation_steps = 4
optim = "paged_adamw_32bit"
save_steps = 100
logging_steps = 10
learning_rate = 2e-4
max_grad_norm = 0.3
max_steps = 100
warmup_ratio = 0.03
lr_scheduler_type = "fixed"
training_arguments = TrainingArguments(
output_dir=output_dir,
per_device_train_batch_size=per_device_train_batch_size,
gradient_accumulation_steps=gradient_accumulation_steps,
optim=optim,
save_steps=save_steps,
logging_steps=logging_steps,
learning_rate=learning_rate,
fp16=True,
max_grad_norm=max_grad_norm,
max_steps=max_steps,
warmup_ratio=warmup_ratio,
group_by_length=True,
lr_scheduler_type=lr_scheduler_type,
)
from trl import SFTTrainer
max_seq_length = 512
coach = SFTTrainer(
mannequin=mannequin,
train_dataset=dataset,
peft_config=peft_config,
dataset_text_field="textual content",
max_seq_length=max_seq_length,
tokenizer=tokenizer,
args=training_arguments,
)
coach.practice()
AWQ (Tháng 6 năm 2023)
AWQ (Lượng tử hóa trọng lượng nhận biết kích hoạt) là phương pháp Lượng tử hóa sau đào tạo. Trong phương pháp này, các hoạt động của mô hình được xem xét thay cho trọng số. Tôi xin trích dẫn trực tiếp từ giấy (3),
Phương pháp của chúng tôi dựa trên quan sát rằng trọng số không quan trọng như nhau: chỉ bảo vệ 1% trọng số nổi bật có thể giảm đáng kể lỗi lượng tử hóa. Sau đó, chúng tôi đề xuất tìm kiếm tỷ lệ tối ưu cho mỗi kênh bảo vệ trọng số nổi bật bằng cách quan sát hoạt động, không phải trọng số.
Ưu điểm
AWQ cung cấp độ chính xác cao hơn các phương pháp khác vì các trọng số quan trọng đối với hiệu suất LLM được bảo toàn. Nó cũng hiệu quả và nhanh hơn vì không liên quan đến việc truyền ngược hoặc tái tạo. Nó hoạt động tốt trên các thiết bị biên.
Nhược điểm
Mặc dù việc duy trì 0,1% trọng số trong FP16 có thể nâng cao hiệu suất lượng tử hóa mà không làm tăng đáng kể kích thước mô hình, nhưng kiểu dữ liệu có độ chính xác hỗn hợp này làm phức tạp việc triển khai hệ thống.
Triển khai mã
Cài đặt các thư viện cần thiết.
!pip set up autoawq transformers speed up
Tải mô hình và lượng tử hóa nó với tự độngawq thư viện.
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_id = 'meta-llama/Llama-2-7b-hf'
quant_path = 'Llama2-7b-awq-4bit'
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4 }# Load mannequin and tokenizer
mannequin = AutoAWQForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
# Quantize
mannequin.quantize(tokenizer, quant_config=quant_config)
Câu nói dí dỏm# (Tháng 7 năm 2023)
Nói một cách đơn giản, QuIP (Lượng tử hóa với Xử lý không mạch lạc) dựa trên ý tưởng rằng quá trình lượng tử hóa có thể được cải thiện nếu trọng số của mô hình được phân bổ đều (không mạch lạc) và các hướng quan trọng để làm tròn chúng không được căn chỉnh với các trục tọa độ. Nó bao gồm hai bước:
- LDLQ Quy trình làm tròn thích ứng: Điều chỉnh trọng số của mô hình theo cách giảm thiểu một số biện pháp lỗi nhất định (‘mục tiêu đại diện bậc hai’) (8).
- Tiền xử lý và hậu xử lý: Nhân trọng số và ma trận Hessian với ma trận trực giao ngẫu nhiên. Điều này đảm bảo rằng trọng số và Hessian không nhất quán, có lợi cho quá trình lượng tử hóa.
QuIP# (5) tiến bộ trên QuIP bằng cách sử dụng một số cải tiến trong xử lý.
- Xử lý không mạch lạc được cải thiện:Nó sử dụng một phương pháp nhanh hơn và tốt hơn được gọi là biến đổi Hadamard ngẫu nhiên.
- Phép lượng tử vector: QuIP# sử dụng lượng tử hóa vectơ để tận dụng phân phối dưới Gauss hình quả bóng mà các trọng số không nhất quán sở hữu. Cụ thể, nó giới thiệu một bộ sổ mã hiệu quả về phần cứng dựa trên mạng E8 có tính đối xứng cao. Mạng E8 đạt được sự đóng gói bóng đơn vị 8 chiều tối ưu, có nghĩa là nó có thể biểu diễn các trọng số hiệu quả hơn.
Ưu điểm
So với các phương pháp khác, QuIP# cung cấp thông lượng cao hơn đáng kể (>40%) ở cùng chất lượng lượng tử hóa hoặc tốt hơn. Điều đó không tệ đối với lượng tử hóa 2 bit.
Nhược điểm
Mặc dù không đề cập đến nhiều hạn chế nhưng có thể cân nhắc đến độ phức tạp và khả năng tương thích của phần cứng.
Triển khai mã
Sao chép kho lưu trữ chính thức và cài đặt các thư viện cần thiết.
git clone https://github.com/Cornell-RelaxML/quip-sharp.git
pip set up -r necessities.txt
cd quiptools && python setup.py set up && cd ../
Tìm các tập lệnh cho các mô hình khác nhau. Chạy tập lệnh quantize_finetune_llama.py
sử dụng mô hình lạc đà không bướu.
Ngoài ra, hãy kiểm tra kho lưu trữ để lượng tử hóa quip. Mã để lượng tử hóa các mô hình như được hiển thị.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from quantizer import QuipQuantizermodel_name = "meta-llama/Llama-2-70b-hf"
quant_dir = "llama-70b_2bit_quip"
tokenizer = AutoTokenizer.from_pretrained(model_name)
mannequin = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
quant = QuipQuantizer(codebook="E8P12", dataset="redpajama")
quant.quantize_model(mannequin, tokenizer, quant_dir)
GGUF (tháng 8 năm 2023)
GGUF (Định dạng thống nhất do GPT tạo ra) là một bản phát hành được mong đợi cao bởi Georgi Gerganov và llama.cpp group. Điểm nổi bật chính thực sự là tính năng mà LLM hiện có thể chạy dễ dàng trên CPU của người tiêu dùng. Trước đây nó được gọi là GGML và sau đó được nâng cấp thành GGUF.
Một thành tựu đáng chú ý của GGML là khả năng chuyển một số lớp LLM sang GPU nếu cần ngay cả khi LLM hoạt động trên CPU. Điều này giải quyết hiệu quả thách thức toàn cầu mà các nhà phát triển phải đối mặt do VRAM không đủ.
Ưu điểm
Nếu bạn định chạy LLM trên CPU hoặc thiết bị Apple (chip dòng M), thì đây là phương pháp goto cho nhiều LLM như Llama và Mistral. Định dạng tệp GGUF hiện được hỗ trợ tốt bởi llama.cpp và HuggingFace. Các mô hình GGUF cũng cho thấy điểm số khó hiểu thấp hơn so với các định dạng khác.
Nhược điểm
GGUF tập trung vào CPU và các thiết bị dòng Apple M. Đây có thể là một hạn chế nếu bạn đang làm việc với các cấu hình phần cứng khác nhau.
Triển khai mã
Cài đặt ctransformers
thư viện.
pip set up ctransformers(cuda)
Các mô hình có sẵn trong kho lưu trữ của Bloke tại HuggingFace.
from ctransformers import AutoModelForCausalLM
from transformers import AutoTokenizer, pipeline# Load LLM and Tokenizer
# Use `gpu_layers` to specify what number of layers will probably be offloaded to the GPU.
mannequin = AutoModelForCausalLM.from_pretrained(
"TheBloke/zephyr-7B-beta-GGUF",
model_file="zephyr-7b-beta.Q4_K_M.gguf",
model_type="mistral", gpu_layers=50, hf=True
)
tokenizer = AutoTokenizer.from_pretrained(
"HuggingFaceH4/zephyr-7b-beta", use_fast=True
)
# Create a pipeline
pipe = pipeline(mannequin=mannequin, tokenizer=tokenizer, activity='text-generation')
from ctransformers import AutoModelForCausalLM
from transformers import AutoTokenizer, pipeline# Load LLM and Tokenizer
# Use `gpu_layers` to specify what number of layers will probably be offloaded to the GPU.
mannequin = AutoModelForCausalLM.from_pretrained(
"TheBloke/zephyr-7B-beta-GGUF",
model_file="zephyr-7b-beta.Q4_K_M.gguf",
model_type="mistral", gpu_layers=50, hf=True
)
tokenizer = AutoTokenizer.from_pretrained(
"HuggingFaceH4/zephyr-7b-beta", use_fast=True
)
# Create a pipeline
pipe = pipeline(mannequin=mannequin, tokenizer=tokenizer, activity='text-generation')
Trụ sở chính (Tháng 11 năm 2023)
Theo bài báo, hiệu chuẩn trọng lượng có thể đạt được bằng các kỹ thuật hiệu chuẩn không cần dữ liệu (BitsAndBytes) và các kỹ thuật dựa trên hiệu chuẩn (GPTQ và AWQ). Trong khi các phương pháp không cần hiệu chuẩn nhanh hơn, các phương pháp dựa trên hiệu chuẩn lại gặp phải sai lệch dữ liệu và thời gian lượng tử hóa.
HQQ (Lượng tử hóa bán bậc hai) thực hiện lượng tử hóa theo thời gian thực bằng cách sử dụng tối ưu hóa nhanh chóng và chắc chắn. Nó loại bỏ nhu cầu về dữ liệu hiệu chuẩn và đủ linh hoạt để lượng tử hóa bất kỳ mô hình nào, do đó đạt được tốc độ của các phương pháp không hiệu chuẩn mà không có vấn đề về sai lệch dữ liệu. Nó giảm đáng kể thời gian lượng tử hóa xuống còn gần vài phút do các kỹ thuật tối ưu hóa như phân tách bán phần bậc hai. Để biết thêm chi tiết về toán học và cách thức hoạt động của phương pháp, hãy xem Trang web chính thức.
Ưu điểm
Đạt được thời gian lượng tử hóa thấp đáng ngạc nhiên so với các phương pháp khác (nhanh hơn 50 lần so với GPTQ!). Việc loại bỏ các yêu cầu về dữ liệu hiệu chuẩn giúp việc này dễ dàng hơn.
Nhược điểm
Không có nhiều hạn chế được đề cập ở nơi khác. Nó vẫn có thể cho thấy sự suy giảm chất lượng như các phương pháp khác.
Triển khai mã
Cài đặt thư viện biến áp và sử dụng ngay triển khai HQQ!
from transformers import AutoModelForCausalLM, HqqConfig# All linear layers will use the identical quantization config
quant_config = HqqConfig(nbits=4, group_size=64, quant_zero=False, quant_scale=False, axis=1)
model_id = "meta-llama/Llama-2-7b-hf"
# Load and quantize
mannequin = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="cuda",
quantization_config=quant_config
)
AQLM (Tháng 2 năm 2024)
AQLM (Lượng tử hóa cộng tính của mô hình ngôn ngữ) là phương pháp PTQ chỉ dựa trên trọng số, thiết lập chuẩn mực mới trong phạm vi 2 bit cho mỗi tham số. Nó vượt trội hơn các thuật toán phổ biến như GPTQ cũng như QuIP và QuIP#.
Nó áp dụng một phương pháp mới gọi là Lượng tử hóa đa mã (MCQ) chia mỗi vectơ thành các vectơ con và xấp xỉ chúng bằng cách sử dụng một tập hợp hữu hạn từ mã. Từ mã là các vectơ đã học được xác định trong một sổ mã (7). AQLM hoạt động bằng cách lấy các hàng của ma trận trọng số trong một mô hình và lượng tử hóa chúng.
Ưu điểm
AQLM cung cấp khả năng triển khai nhanh chóng để tạo mã thông báo trên cả GPU và CPU, cho phép vượt qua tốc độ của các triển khai FP16 được tối ưu hóa, đồng thời hoạt động trong phạm vi bộ nhớ được giảm đáng kể.
Nhược điểm
Chỉ có một vài hạn chế được đề cập ở nơi khác. Nó vẫn có thể cho thấy sự suy giảm chất lượng như các phương pháp khác.
Triển khai mã
Hướng dẫn về cách tự lượng tử hóa các mô hình và mã tương ứng có thể được tìm thấy trong kho lưu trữ chính thức. Để chạy các mô hình AQLM, hãy tải một mô hình đã được lượng tử hóa bằng AQLM:
from transformers import AutoTokenizer, AutoModelForCausalLMquantized_model = AutoModelForCausalLM.from_pretrained(
"ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf")
Các phương pháp lượng tử hóa đã mở ra một thế giới khả năng, cho phép khả năng xử lý ngôn ngữ nâng cao ngay cả trong túi của chúng ta. Trong bài viết này, chúng tôi đã thảo luận về tất cả về lượng tử hóa LLM và khám phá chi tiết các phương pháp khác nhau để lượng tử hóa LLM. Chúng tôi cũng đã trải qua những ưu và nhược điểm của từng phương pháp và tìm hiểu cách sử dụng chúng. Hơn nữa, chúng tôi đã có được những hiểu biết sâu sắc về cách lựa chọn phương pháp phù hợp nhất dựa trên các yêu cầu cụ thể và liệu bạn đang sử dụng CPU hay GPU.
[ad_2]
Source link