Разработка AutoGPTQ прекратилась. Пожалуйста, переключитесь на GPTQModel в качестве замены.
Простой в использовании пакет квантования LLM с удобными для пользователя API, основанный на алгоритме GPTQ (квантование только для веса).
use_marlin=True при загрузке моделей.auto-gptq , поэтому теперь работающие и обучение моделей GPTQ может быть более доступным для всех! Смотрите этот блог и его ресурсы для более подробной информации!Для получения дополнительной истории обратитесь сюда
Результат генерируется с использованием этого сценария, размер входа пакета составляет 1, стратегия декодирования - поиск пучка, и применять модель для генерации 512 токенов, показатель скорости - токены/с (чем больше, тем лучше).
Квантовая модель загружается с использованием настройки, которая может получить самую быструю скорость вывода.
| модель | Графический процессор | num_beams | FP16 | gptq-int4 |
|---|---|---|---|---|
| Лама-7B | 1xa100-40g | 1 | 18.87 | 25.53 |
| Лама-7B | 1xa100-40g | 4 | 68,79 | 91.30 |
| Мосс-Мун 16B | 1xa100-40g | 1 | 12.48 | 15.25 |
| Мосс-Мун 16B | 1xa100-40g | 4 | Непрерывно | 42,67 |
| Мосс-Мун 16B | 2xa100-40g | 1 | 06.83 | 06.78 |
| Мосс-Мун 16B | 2xa100-40g | 4 | 13.10 | 10.80 |
| GPT-J 6B | 1xrtx3060-12g | 1 | Непрерывно | 29,55 |
| GPT-J 6B | 1xrtx3060-12g | 4 | Непрерывно | 47.36 |
Для сравнения недоумения вы можете обратиться тут и здесь
Autogptq доступен только на Linux и Windows. Вы можете установить последний стабильный выпуск AutoGPTQ из PIP с предварительно построенными колесами:
| Платформа версия | Установка | Построен против Pytorch |
|---|---|---|
| Cuda 11.8 | pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/ | 2.2.1+CU118 |
| CUDA 12.1 | pip install auto-gptq --no-build-isolation | 2.2.1+CU121 |
| ROCM 5.7 | pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm573/ | 2.2.1+ROCM5.7 |
AutoGPTQ может быть установлен с зависимостью Triton с pip install auto-gptq[triton] --no-build-isolation , чтобы иметь возможность использовать бэкэнд TRITON (в настоящее время только поддерживает Linux, без 3-битных квантизации).
Для более старых AutoGPTQ, пожалуйста, обратитесь к таблице установки предыдущих выпусков.
В Nvidia Systems AutoGPTQ не поддерживает Maxwell или нижних графических процессоров.
Клонировать исходный код:
git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ Несколько пакетов требуются для того, чтобы построить из источника: pip install numpy gekko pandas .
Затем установите локально из источника:
pip install -vvv --no-build-isolation -e . Вы можете установить BUILD_CUDA_EXT=0 , чтобы отключить здание расширения Pytorch, но это сильно не рекомендуется Autogptq, затем отступает на медленную реализацию Python.
В качестве последнего средства, если вышеупомянутая команда не выполняется, вы можете попробовать python setup.py install .
Чтобы установить из источника для AMD -графических процессоров, поддерживающих ROCM, укажите переменную среды ROCM_VERSION . Пример:
ROCM_VERSION=5.6 pip install -vvv --no-build-isolation -e . Компиляция может быть ускорена, указав переменную PYTORCH_ROCM_ARCH (ссылка) для создания для одного целевого устройства, например, gfx90a для устройств серии MI200.
Для систем ROCM для построения необходимы пакеты rocsparse-dev , hipsparse-dev , rocthrust-dev , rocblas-dev и hipblas-dev .
Примечание: убедитесь, что вы находитесь в коммите 65C2E15 или позже
Чтобы установить из источника для Intel Gaudi 2 HPU, установите переменную среды BUILD_CUDA_EXT=0 , чтобы отключить построение расширения Cuda Pytorch. Пример:
BUILD_CUDA_EXT=0 pip install -vvv --no-build-isolation -e .Обратите внимание, что Intel Gaudi 2 использует оптимизированное ядро при выводе и требует
BUILD_CUDA_EXT=0на не-CUDA Machines.
Предупреждение: это всего лишь демонстрация использования основных API в AutoGPTQ, в которой используется только один образец для квантования гораздо маленькой модели, качество квантовой модели с использованием таких маленьких образцов может не очень хорошо.
Ниже приведен пример для простейшего использования auto_gptq для квантования модели и вывода после квантования:
from transformers import AutoTokenizer , TextGenerationPipeline
from auto_gptq import AutoGPTQForCausalLM , BaseQuantizeConfig
import logging
logging . basicConfig (
format = "%(asctime)s %(levelname)s [%(name)s] %(message)s" , level = logging . INFO , datefmt = "%Y-%m-%d %H:%M:%S"
)
pretrained_model_dir = "facebook/opt-125m"
quantized_model_dir = "opt-125m-4bit"
tokenizer = AutoTokenizer . from_pretrained ( pretrained_model_dir , use_fast = True )
examples = [
tokenizer (
"auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."
)
]
quantize_config = BaseQuantizeConfig (
bits = 4 , # quantize model to 4-bit
group_size = 128 , # it is recommended to set the value to 128
desc_act = False , # set to False can significantly speed up inference but the perplexity may slightly bad
)
# load un-quantized model, by default, the model will always be loaded into CPU memory
model = AutoGPTQForCausalLM . from_pretrained ( pretrained_model_dir , quantize_config )
# quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask"
model . quantize ( examples )
# save quantized model
model . save_quantized ( quantized_model_dir )
# save quantized model using safetensors
model . save_quantized ( quantized_model_dir , use_safetensors = True )
# push quantized model to Hugging Face Hub.
# to use use_auth_token=True, Login first via huggingface-cli login.
# or pass explcit token with: use_auth_token="hf_xxxxxxx"
# (uncomment the following three lines to enable this feature)
# repo_id = f"YourUserName/{quantized_model_dir}"
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True)
# alternatively you can save and push at the same time
# (uncomment the following three lines to enable this feature)
# repo_id = f"YourUserName/{quantized_model_dir}"
# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}"
# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True)
# load quantized model to the first GPU
model = AutoGPTQForCausalLM . from_quantized ( quantized_model_dir , device = "cuda:0" )
# download quantized model from Hugging Face Hub and load to the first GPU
# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False)
# inference with model.generate
print ( tokenizer . decode ( model . generate ( ** tokenizer ( "auto_gptq is" , return_tensors = "pt" ). to ( model . device ))[ 0 ]))
# or you can also use pipeline
pipeline = TextGenerationPipeline ( model = model , tokenizer = tokenizer )
print ( pipeline ( "auto-gptq is" )[ 0 ][ "generated_text" ])Для более расширенных функций квантования модели, пожалуйста, ссылайтесь на этот сценарий
from auto_gptq . modeling import BaseGPTQForCausalLM
class OPTGPTQForCausalLM ( BaseGPTQForCausalLM ):
# chained attribute name of transformer layer block
layers_block_name = "model.decoder.layers"
# chained attribute names of other nn modules that in the same level as the transformer layer block
outside_layer_modules = [
"model.decoder.embed_tokens" , "model.decoder.embed_positions" , "model.decoder.project_out" ,
"model.decoder.project_in" , "model.decoder.final_layer_norm"
]
# chained attribute names of linear layers in transformer layer module
# normally, there are four sub lists, for each one the modules in it can be seen as one operation,
# and the order should be the order when they are truly executed, in this case (and usually in most cases),
# they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output
inside_layer_modules = [
[ "self_attn.k_proj" , "self_attn.v_proj" , "self_attn.q_proj" ],
[ "self_attn.out_proj" ],
[ "fc1" ],
[ "fc2" ]
] После этого вы можете использовать OPTGPTQForCausalLM.from_pretrained и другие методы, как показано в основном.
Вы можете использовать задачи, определенные в auto_gptq.eval_tasks , чтобы оценить производительность модели по конкретной задаче вниз по потоку до и после квантования.
Предопределенные задачи подтверждают все модели причинно-следственного языка, реализованные? Трансформеры и в этом проекте.
from functools import partial
import datasets
from transformers import AutoTokenizer , AutoModelForCausalLM , GenerationConfig
from auto_gptq import AutoGPTQForCausalLM , BaseQuantizeConfig
from auto_gptq . eval_tasks import SequenceClassificationTask
MODEL = "EleutherAI/gpt-j-6b"
DATASET = "cardiffnlp/tweet_sentiment_multilingual"
TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}. n Text: {text} n Answer:"
ID2LABEL = {
0 : "negative" ,
1 : "neutral" ,
2 : "positive"
}
LABELS = list ( ID2LABEL . values ())
def ds_refactor_fn ( samples ):
text_data = samples [ "text" ]
label_data = samples [ "label" ]
new_samples = { "prompt" : [], "label" : []}
for text , label in zip ( text_data , label_data ):
prompt = TEMPLATE . format ( labels = LABELS , text = text )
new_samples [ "prompt" ]. append ( prompt )
new_samples [ "label" ]. append ( ID2LABEL [ label ])
return new_samples
# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0")
model = AutoGPTQForCausalLM . from_pretrained ( MODEL , BaseQuantizeConfig ())
tokenizer = AutoTokenizer . from_pretrained ( MODEL )
task = SequenceClassificationTask (
model = model ,
tokenizer = tokenizer ,
classes = LABELS ,
data_name_or_path = DATASET ,
prompt_col_name = "prompt" ,
label_col_name = "label" ,
** {
"num_samples" : 1000 , # how many samples will be sampled to evaluation
"sample_max_len" : 1024 , # max tokens for each sample
"block_max_len" : 2048 , # max tokens for each data block
# function to load dataset, one must only accept data_name_or_path as input
# and return datasets.Dataset
"load_fn" : partial ( datasets . load_dataset , name = "english" ),
# function to preprocess dataset, which is used for datasets.Dataset.map,
# must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name]
"preprocess_fn" : ds_refactor_fn ,
# truncate label when sample's length exceed sample_max_len
"truncate_prompt" : False
}
)
# note that max_new_tokens will be automatically specified internally based on given classes
print ( task . run ())
# self-consistency
print (
task . run (
generation_config = GenerationConfig (
num_beams = 3 ,
num_return_sequences = 3 ,
do_sample = True
)
)
) Учебные пособия обеспечивают пошаговое руководство по интеграции auto_gptq с вашим собственным проектом и некоторыми принципами лучших практик.
Примеры дают множество примеров сценариев для использования auto_gptq по -разному.
Вы можете использовать
model.config.model_typeдля сравнения с таблицей ниже, чтобы проверить, поддерживается ли используемая вами модельauto_gptq.Например, Model_type of
WizardLM,vicunaиgpt4all- всеllama, поэтому все они поддерживаютсяauto_gptq.
| тип модели | квантование | вывод | Пефт-Лора | Пефт-Ада-Лора | PEFT-ADAPTION_PROMPT |
|---|---|---|---|---|---|
| цвести | ✅ | ✅ | ✅ | ✅ | |
| GPT2 | ✅ | ✅ | ✅ | ✅ | |
| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅ Руководит эту печать филиала |
| GPTJ | ✅ | ✅ | ✅ | ✅ | ✅ Руководит эту печать филиала |
| лама | ✅ | ✅ | ✅ | ✅ | ✅ |
| мох | ✅ | ✅ | ✅ | ✅ | ✅ Руководит эту печать филиала |
| Опт | ✅ | ✅ | ✅ | ✅ | |
| GPT_BIGCODE | ✅ | ✅ | ✅ | ✅ | |
| CodeGen | ✅ | ✅ | ✅ | ✅ | |
| Сокол (RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ |
В настоящее время auto_gptq поддерживает: LanguageModelingTask , SequenceClassificationTask и TextSummarizationTask ; Скоро придет больше задач!
Тесты можно запустить с:
pytest tests/ -s
Autogptq по умолчанию использует ядро exllamav2 int4*fp16 для умножения матрицы.
Marlin-это оптимизированное ядро Int4 * FP16 было недавно предложено по адресу https://github.com/ist-daslab/marlin. Это интегрировано в AutoGPTQ при загрузке модели с помощью use_marlin=True . Это ядро доступно только на устройствах с вычислительными возможностями 8.0 или 8,6 (графические процессоры Ampere).