O desenvolvimento da AutoGPTQ parou. Por favor, mude para o GPTQModel como substituição de drop-in.
Um pacote de quantização LLM fácil de usar com APIs amigáveis, com base no algoritmo GPTQ (quantização somente de peso).
use_marlin=True modelos de carregamento.auto-gptq integrado, então agora executando e treinando os modelos GPTQ pode estar mais disponível para todos! Veja este blog e seus recursos para obter mais detalhes!Para mais histórias, vire aqui
O resultado é gerado usando esse script, o tamanho do lote da entrada é 1, a estratégia de decodificação é a pesquisa de feixes e aplica o modelo para gerar 512 tokens, a métrica de velocidade é tokens/s (maior, melhor).
O modelo quantizado é carregado usando a configuração que pode obter a velocidade de inferência mais rápida.
| modelo | GPU | num_beams | FP16 | GPTQ-INT4 |
|---|---|---|---|---|
| llama-7b | 1XA100-40G | 1 | 18.87 | 25.53 |
| llama-7b | 1XA100-40G | 4 | 68,79 | 91.30 |
| Moss-Moon 16b | 1XA100-40G | 1 | 12.48 | 15.25 |
| Moss-Moon 16b | 1XA100-40G | 4 | OOM | 42.67 |
| Moss-Moon 16b | 2XA100-40G | 1 | 06.83 | 06.78 |
| Moss-Moon 16b | 2XA100-40G | 4 | 13.10 | 10.80 |
| GPT-J 6b | 1XRTX3060-12G | 1 | OOM | 29.55 |
| GPT-J 6b | 1XRTX3060-12G | 4 | OOM | 47.36 |
Para comparação perplexidade, você pode recorrer aqui e aqui
O AutoGPTQ está disponível apenas no Linux e no Windows. Você pode instalar o lançamento estável mais recente do AutoGPTQ da PIP com rodas pré-construídas:
| Versão da plataforma | Instalação | Construído contra 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 |
O AutoGPTQ pode ser instalado com a dependência do Triton com pip install auto-gptq[triton] --no-build-isolation para poder usar o back-end do Triton (atualmente suporta apenas o Linux, sem quantização de 3 bits).
Para o AutoGPTQ mais antigo, consulte a tabela de instalação de lançamentos anteriores.
Nos sistemas NVIDIA, o AutoGPTQ não suporta Maxwell ou Lower GPUs.
Clone o código -fonte:
git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ São necessários alguns pacotes para construir a partir da fonte: pip install numpy gekko pandas .
Em seguida, instale localmente a partir da fonte:
pip install -vvv --no-build-isolation -e . Você pode definir BUILD_CUDA_EXT=0 para desativar o edifício Pytorch Extension, mas isso é fortemente desencorajado à medida que o AutoGPTQ volta a uma implementação lenta do Python.
Como último recurso, se o comando acima falhar, você poderá experimentar python setup.py install .
Para instalar a partir da Origem para GPUs AMD que suportam o ROCM, especifique a variável ROCM_VERSION HIMPEMPORT. Exemplo:
ROCM_VERSION=5.6 pip install -vvv --no-build-isolation -e . A compilação pode ser acelerada especificando a variável PYTORCH_ROCM_ARCH (referência) para criar um único dispositivo de destino, por exemplo, gfx90a para dispositivos da série MI200.
Para os sistemas ROCM, os pacotes rocsparse-dev , hipsparse-dev , rocthrust-dev , rocblas-dev e hipblas-dev são necessários para construir.
Aviso: verifique se você está cometido 65c2e15 ou mais tarde
Para instalar da fonte para Intel Gaudi 2 hpus, defina a variável de ambiente BUILD_CUDA_EXT=0 para desativar a construção da extensão CUDA Pytorch. Exemplo:
BUILD_CUDA_EXT=0 pip install -vvv --no-build-isolation -e .Observe que a Intel Gaudi 2 usa um kernel otimizado após a inferência e requer
BUILD_CUDA_EXT=0em máquinas não-CUDA.
AVISO: Esta é apenas uma vitrine do uso de APIs básicas no AutoGPTQ, que usa apenas uma amostra para quantizar um modelo muito pequeno, a qualidade do modelo quantizado usando essas pequenas amostras pode não ser bom.
Abaixo está um exemplo para o uso mais simples do auto_gptq para quantizar um modelo e inferência após a quantização:
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" ])Para recursos mais avançados da quantização do modelo, faça referência a este script
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" ]
] Depois disso, você pode usar OPTGPTQForCausalLM.from_pretrained e outros métodos, como mostrado no BASIC.
Você pode usar tarefas definidas em auto_gptq.eval_tasks para avaliar o desempenho do modelo em tarefas específicas para baixo antes e após a quantização.
As tarefas predefinidas suportam todos os modelos causais de linguagem implementada? Transformadores e neste projeto.
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
)
)
) Os tutoriais fornecem orientações passo a passo para integrar auto_gptq ao seu próprio projeto e alguns princípios de melhores práticas.
Os exemplos fornecem muitos scripts de exemplo para usar auto_gptq de maneiras diferentes.
Você pode usar
model.config.model_typepara comparar com a tabela abaixo para verificar se o modelo que você usa é suportado peloauto_gptq.Por exemplo, Model_Type de
WizardLM,vicunaegpt4allsão todosllama, portanto, todos são suportados peloauto_gptq.
| Tipo de modelo | quantização | inferência | peft-lora | Peft-Ada-Lora | peft-daption_prompt |
|---|---|---|---|---|---|
| florescer | ✅ | ✅ | ✅ | ✅ | |
| GPT2 | ✅ | ✅ | ✅ | ✅ | |
| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅Requise este ramo de peft |
| GPTJ | ✅ | ✅ | ✅ | ✅ | ✅Requise este ramo de peft |
| lhama | ✅ | ✅ | ✅ | ✅ | ✅ |
| musgo | ✅ | ✅ | ✅ | ✅ | ✅Requise este ramo de peft |
| optar | ✅ | ✅ | ✅ | ✅ | |
| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | |
| CodeGen | ✅ | ✅ | ✅ | ✅ | |
| Falcon (refinadawebmodel/refinedweb) | ✅ | ✅ | ✅ | ✅ |
Atualmente, os suportes auto_gptq : LanguageModelingTask , SequenceClassificationTask e TextSummarizationTask ; Mais tarefas virão em breve!
Os testes podem ser executados com:
pytest tests/ -s
O AutoGPTQ é o padrão de usar o kernel exllamav2 INT4*FP16 para multiplicação da matriz.
Marlin é um kernel INT4 * FP16 otimizado foi recentemente proposto em https://github.com/ist-daslab/marlin. Isso é integrado no AutoGPTQ ao carregar um modelo com use_marlin=True . Este kernel está disponível apenas em dispositivos com capacidade de computação 8.0 ou 8.6 (GPUs ampere).