机器学习平台是一套服务于专业算法工程师,整合云原生的工具+算力(GPU、CPU云服务器),进行一站式AI算法开发和迭代的平台。本方案将为您介绍如何在 MLP 对 Meta-Llama-3.1-8B 的开源模型进行AWQ量化。
说明
在实践过程中,如果因网络等问题导致模型、数据集或量化工具等无法下载到 TOS bucket ,建议您可以先将其下载到开发机云盘中,再自行拷贝到 TOS 路径下。
本方案以对 Meta-Llama-3.1-8B 模型进行AWQ量化为例,在开始执行操作前,请确认您已经完成以下准备工作:
已开通网络/TOS/CFS,具体操作详见更改预付费资源组的负载网络VPC--机器学习平台-火山引擎、控制台快速入门--对象存储-火山引擎、访问文件存储实例--大数据文件存储-火山引擎。
已购买 MLP 资源,详见创建资源组--机器学习平台-火山引擎。关于资源价格详情,请详见实例规格及定价--机器学习平台-火山引擎。
已创建开发机实例,其中关键参数配置如下。具体操作详见创建开发机--机器学习平台-火山引擎。
资源规格:配置以下资源规格。
挂载配置:挂载 TOS bucket 和 CFS,具体操作详见训练代码如何访问TOS--机器学习平台-火山引擎。
镜像地址:在自定义镜像处配置下方镜像,填写 SSH key 并挂载 TOS。由于拉取的镜像较大,首次创建开发机时间预计 20 分钟。
vemlp-demo-cn-shanghai.cr.volces.com/demo/quantization:1.0
进入开发机。
配置 volc configure。具体操作详见使用文档--机器学习平台-火山引擎。
# 配置AK/SK,以及环境的Region
volc configure
export HF_TOKEN=<User Specific Huggingface Access Token>
export HF_ENDPOINT=https://hf-mirror.com 、
pip3 install -U huggingface_hub
参数说明如下:
参数 | 描述 |
---|---|
hf_token | 具有llama使用权限的Huggingface账号的hf_token。 |
hf_endpoint | 镜像地址。 |
说明
cd /vemlp-demo-models
mkdir model-llama-awq
cd model-llama-awq
huggingface-cli download --token $HF_TOKEN --resume-download meta-llama/Meta-Llama-3.1-8B-Instruct --local-dir $ORIGINAL_MODEL_PATH
其中运行 huggingface-cli 命令行,需要传入的参数列表说明如下:
参数 | 描述 |
---|---|
hf_token | 具有llama使用权限的Huggingface账号的hf_token。 |
original_model_path | 基础模型的本地存储路径。 |
在 Terminal 执行以下命令,可以直接下载开源的 wikitext2 数据集,来帮助 AWQ 做量化校准。
cd /vemlp-demo-models
mkdir datasets-llama-awq
huggingface-cli download --repo-type dataset --resume-download carlosejimenez/wikitext__wikitext-2-raw-v1 --local-dir $CALIB_DATASET_PATH
参数说明如下:
参数 | 描述 |
---|---|
calib_dataset_path | 用来校验量化结果的数据集的路径。 |
cd /vemlp-demo-models
touch awq-quant.py
import os
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
from datasets import load_dataset
# 配置模型、数据集地址
os.environ['BASE_MODEL_PATH'] = '/vemlp-demo-models/model-llama-awq/Meta-Llama-3.1-8B'
os.environ['CALIB_DATASET_PATH'] = '/vemlp-demo-models/datasets-llama-awq/'
os.environ['QUANT_MODEL_PATH'] = '/vemlp-demo-models/model-quant-awq'
model_path = os.getenv('BASE_MODEL_PATH')
dataset_path = os.getenv('CALIB_DATASET_PATH')
quant_path = os.getenv('QUANT_MODEL_PATH')
# 加载基础模型及tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoAWQForCausalLM.from_pretrained(model_path, device_map="auto", safetensors=True)
# 加载校准数据集,并准备数据以进行校准。
data = load_dataset(dataset_path, split="train")
dataset = [text for text in data["text"] if text.strip() != '' and len(text.split(' ')) > 20]
# 设置AWQ量化的超参数,目前AutoAWQ仅支持4bit量化,需设置w_bit为4
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
model.quantize(tokenizer, quant_config=quant_config, calib_data=dataset)
model.save_quantized(quant_path, safetensors=True, shard_size="4GB")
tokenizer.save_pretrained(quant_path)
cd /vemlp-demo-models/
touch awq-quant.sh
set -ex
pip install autoawq==0.2.6
python3 awq-quant.py
echo "Finished Model Quantization Task"
# 如果用 ml.pni2 且 GPU driver 是470,可以运行下述命令
pip install autoawq==0.2.1 torch==2.1.0+cu118
pip install autoawq==0.2.1
pip install torch==2.1.0+cu118 --index-url [https://download.pytorch.org/whl](https://download.pytorch.org/whl)
python3 awq-quant.py
echo "Finished Model Quantization Task"
cd /vemlp-demo-models/
bash ./awq-quant.sh
执行完成后,输出路径文件如下。
du -sh $BASE_MODEL_PATH $QUANT_MODEL_PATH
对比结果如下:可见在模型容量上,经过 AWQ 4bit 量化后模型大小约为量化前模型的1/3。
diff $QUANT_MODEL_PATH/config.json $BASE_MODEL_PATH/config.json
对比结果如下:可见量化后模型多了关于量化的信息 -- quantization_config。
进入自定义任务控制台
配置环境
vemlp-cn-beijing.cr.volces.com/preset-images/pytorch:2.1.0
cat > awq-quant.py <<EOF
import os
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
from datasets import load_dataset
# 模型、数据集地址配置
os.environ['BASE_MODEL_PATH'] = '/vemlp-demo-models/model-llama-awq/Meta-Llama-3.1-8B'
os.environ['CALIB_DATASET_PATH'] = '/vemlp-demo-models/datasets-llama-awq/'
os.environ['QUANT_MODEL_PATH'] = '/vemlp-demo-models/model-quant-awq'
model_path = os.getenv('BASE_MODEL_PATH')
dataset_path = os.getenv('CALIB_DATASET_PATH')
quant_path = os.getenv('QUANT_MODEL_PATH')
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoAWQForCausalLM.from_pretrained(model_path, device_map="auto", safetensors=True)
data = load_dataset(dataset_path, split="train")
dataset = [text for text in data["text"] if text.strip() != '' and len(text.split(' ')) > 20]
# 设置量化超参数
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
model.quantize(tokenizer, quant_config=quant_config, calib_data=dataset)
model.save_quantized(quant_path, safetensors=True, shard_size="4GB")
tokenizer.save_pretrained(quant_path)
EOF
pip install autoawq==0.2.6
python3 awq-quant.py
配置资源
import os
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
from datasets import load_dataset
# 配置模型、数据集地址
os.environ['BASE_MODEL_PATH'] = '/data/model-llama/Meta-Llama-3.1-8B'
os.environ['CALIB_DATASET_PATH'] = '/data/datasets-llama-quant/'
os.environ['QUANT_MODEL_PATH'] = '/data/model-quant-awq'
model_path = os.getenv('BASE_MODEL_PATH')
dataset_path = os.getenv('CALIB_DATASET_PATH')
quant_path = os.getenv('QUANT_MODEL_PATH')
# 加载基础模型及tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoAWQForCausalLM.from_pretrained(model_path, device_map="auto", safetensors=True)
# 加载校准数据集,并准备数据以进行校准。
data = load_dataset(dataset_path, split="train")
dataset = [text for text in data["text"] if text.strip() != '' and len(text.split(' ')) > 20]
# 设置AWQ量化的超参数,目前AutoAWQ仅支持4bit量化,需设置w_bit为4
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
model.quantize(tokenizer, quant_config=quant_config, calib_data=dataset)
model.save_quantized(quant_path, safetensors=True, shard_size="4GB")
tokenizer.save_pretrained(quant_path)
cd /vemlp-demo-models/
touch quantization-task.yaml
TaskName: "Quant-Meta-Llama-3-1-8B-Instruct-AWQ-INT4"
Description: "Use AWQ to quantize Meta-Llama-3.1-8B-Instruct in INT4 format"
Entrypoint: |
cd /data && bash ./awq-quant.sh
Tags: []
Envs: []
ResourceQueueID: "q-**************" #请替换为你自己的 ResourceQueueID
Framework: "PyTorchDDP"
TaskRoleSpecs: #请替换为你自己的 TaskRoleSpecs
- RoleName: "worker"
RoleReplicas: 1
Flavor: "custom"
ResourceSpec:
Family: "ml.xni3c"
CPU: 15.000
Memory: 70.000
GPUNum: 1
ActiveDeadlineSeconds: 3600
EnableTensorBoard: False
Storages: #请替换为你自己的 Storages
- Type: "Tos"
MountPath: "/data"
Bucket: "vemlp-demo-models"
FsName": "testmodel"
MetaCacheExpiryMinutes: "-1"
ImageUrl: "vemlp-demo-cn-shanghai.cr.volces.com/demo/quantization:1.0"
CacheType: "Cloudfs"
RetryOptions:
EnableRetry: False
MaxRetryTimes: 5
IntervalSeconds: 120
PolicySets: []
volc ml_task submit --conf=/vemlp-demo-models/awq-quantization-task.yaml