机器学习平台是一套服务于专业算法工程师,整合云原生的工具+算力 (GPU、CPU云服务器),进行一站式AI算法开发和迭代的平台。本方案将为您介绍如何在 MLP 使用 veTuner 与 veTurboIO 加速 Meta-Llama-3.1-8B 模型的微调,并实现离线评测。
说明
在实践过程中,如果因网络等问题导致模型、数据集或量化工具等无法下载到 TOS bucket ,建议您可以先将其下载到开发机云盘中,再自行拷贝到 TOS 路径下。
本方案以 Meta-Llama-3.1-8B 模型为例,在开始执行操作前,请确认您已经完成以下准备工作:
已开通网络/SFCS,具体操作详见更改预付费资源组的负载网络VPC--机器学习平台-火山引擎、【新功能】创建资源组--机器学习平台-火山引擎、更改预付费资源组的vePFS实例--机器学习平台-火山引擎。
已购买MLP资源,详见创建资源组--机器学习平台-火山引擎。关于资源价格详情,请详见实例规格及定价--机器学习平台-火山引擎。
已创建开发机实例,其中关键参数配置如下。具体操作详见创建开发机--机器学习平台-火山引擎。
资源规格:配置以下资源规格。
CPU 实例:8C/64G/20GB云盘。
GPU 卡数:至少 8 卡,最佳实践采用一台 ml.pni2l。
挂载配置:
镜像地址:在自定义镜像处配置下方镜像,填写 SSH key 并挂载 SFCS。由于拉取的镜像较大,首次创建开发机事件预计 20 分钟。
vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1
进入开发机。
登陆 账号登录-火山引擎。
在左侧导航栏单击开发机,在开发机列表页面中单击待操作的开发机名称,进入对应开发机内。
通过 SSH 远程登录开发机,具体操作详见通过SSH远程连接开发机--机器学习平台-火山引擎。
配置 volc configure。具体操作详见使用文档--机器学习平台-火山引擎。
在 Terminal 中执行以下命令,通过镜像源下载 Llama-3.1-8B 模型,并打开挂载的存储桶路径。
cd /vemlp-demo-models mkdir model-llama cd model-llama wget https://hf-mirror.com/hfd/hfd.sh chmod a+x hfd.sh export HF_ENDPOINT=https://hf-mirror.com apt-get update apt-get install aria2 apt-get install git-lfs ./hfd.sh meta-llama/Meta-Llama-3-8B --hf_username $HF_USER_NAME --hf_token $HF_TOKEN --exclude "*pth" --local-dir $ORIGINAL_MODEL_PATH
其中运行 ./hfd.sh 文件,需要传入的参数列表说明如下:
参数 | 描述 |
---|---|
hf_user_name | 具有llama使用权限的Huggingface账号。 |
hf_token | 具有llama使用权限的Huggingface账号的hf_token。 |
original_model_path | 源safetensor路径。 |
说明
在Terminal执行以下命令,下载huggingface上的开源数据集Clinton/Text-to-sql-v1。
cd /vemlp-demo-models mkdir datasets-vetuner cd datasets-vetuner pip3 install -U huggingface_hub HF_ENDPOINT=[https://hf-mirror.com](https://hf-mirror.com/) huggingface-cli download --repo-type dataset --resume-download Clinton/Text-to-sql-v1 --local-dir $DATA_DIR --token=$HF_TOKEN
其中运行 huggingface-cli 文件,需要传入的参数列表说明如下:
参数 | 描述 |
---|---|
hf_token | 具有下载模型、数据集等使用权限的Huggingface账号的hf_token。 |
data_dir | 数据集下载路径。 |
本方案随机筛选回答较短的 100,000 条数据作为训练集,5,000条数据作为测试集。
import json import random import pandas as pd import pyarrow as pa import pyarrow.parquet as pq import os # 从环境变量中读取路径 data_dir = os.getenv('DATA_DIR', '/vemlp-demo-models/datasets-vetuner/Text-to-sql') data_path = os.getenv('DATA_PATH', '/vemlp-demo-models/datasets-vetuner/Text-to-sql/texttosqlv2.jsonl') train_file_path = os.getenv('TRAIN_FILE_PATH','/vemlp-demo-models/datasets-vetuner/Text-to-sql/train.parquet') val_file_path = os.getenv('VAL_FILE_PATH', '/vemlp-demo-models/datasets-vetuner/Text-to-sql/validation.parquet') data = [] max_response_length = 100 with open(data_path, 'r', encoding="utf-8") as f: for line in f: data.append(json.loads(line)) keep_data = [d for d in data if len(d['response']) < max_response_length] random.shuffle(keep_data) validation_list=random.sample([i for i in range(0, len(keep_data))],5000) validation_data = [keep_data[index] for index in validation_list] train_list=random.sample([i for i in range(0, len(keep_data))],100000) train_data = [keep_data[index] for index in train_list] df = pd.DataFrame(validation_data) table = pa.Table.from_pandas(df) pq.write_table(table, val_file_path) df = pd.DataFrame(train_data) table = pa.Table.from_pandas(df) pq.write_table(table, train_file_path)
python makedataset.py
最佳实践文档提供控制台与命令行两种方式的操作说明。
进入自定义任务控制台
配置环境
vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1
bash ./vemlp/train/train.sh vemlp/train/configs/sft_llama3.yaml checkpointing.save_dir=/vemlp-demo-models/demo-vetuner/ckpt/experiments/ checkpointing.load_dir=/vemlp-demo-models/demo-vetuner/ckpt/experiments/ training.micro_batch_size=5 tokenizer.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B model.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B dataset.train_file=/vemlp-demo-models/datasets-vetuner/Text-to-sql/train.parquet checkpointing.use_veturboio=False logging.use_wandb_log=True training.train_iters=1000 model.attn_impl=flash_attn
配置资源
选择合适的资源,最佳实践所用机器为单机 8 卡 ml.hpcpni2l。
挂载SFCS并配置AK/SK。
在Terminal中使用以下命令对 Llama-3.1-8B 模型进行微调,具体操作步骤如下。
创建一个 demo-vetuner-train.yaml 文件。
编辑 yaml 文件,填写镜像、资源规格、环境变量以及入口命令。
运行任务命令。如运行成果,在Terminal会出现 “创建任务成功,task_id=*****” 字样。完整训练时长预计为13分钟左右。
volc ml_task submit --conf=/vemlp-demo-models/demo-vetuner-train.yaml
demo-vetuner-train.yaml 文件示例:
TaskName: "finetine-with-veTuner-for-llama3" Description: "" Tags: [] ImageUrl: "vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1" ResourceQueueID: "q-**************" #请替换为自己的队列ID # DL framework, support: TensorFlow PS,PyTorch DDP,Horovod,BytePS Framework: "PyTorchDDP" # Flavor代表机型,去 https://www.volcengine.com/docs/6459/72363 查询 TaskRoleSpecs: - RoleName: "worker" RoleReplicas: 1 Flavor: "custom" ResourceSpec: Family: "ml.pni2l" CPU: 105.000 Memory: 1875.000 GPUNum: 8 Envs: - Name: "VETURBOIO_USE_SFCS_SDK" Value: "false" - Name: "AK" Value: "****************" #请替换为自己的AK - Name: "SK" Value: "****************" #请替换为自己的SK - Name: "WANDB_REGION" Value: "cn-beijing" AccessType: "Queue" Storages: - Type: "Sfcs" MountPath: "/vemlp-demo-models" Bucket: "vemlp-demo-models" Prefix: "/" FsName: "****" CachePolicyId: "****************" #请替换为自己的缓存策略ID SfcsId: "****************" #请替换为自己的SFCSID Entrypoint: | bash ./vemlp/train/train.sh vemlp/train/configs/sft_llama3.yaml checkpointing.save_dir=/vemlp-demo-models/ckpt/experiments/ checkpointing.load_dir=/vemlp-demo-models/ckpt/experiments/ training.micro_batch_size=5 tokenizer.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B model.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B dataset.train_file=/vemlp-demo-models/datasets-vetuner/Text-to-sql/train.parquet checkpointing.use_veturboio=False logging.use_wandb_log=True training.train_iters=1000 model.attn_impl=flash_attn
完成训练后,您可通过离线评测验证微调模型性能。最佳实践文档提供控制台与命令行两种方式的操作说明。
进入自定义任务控制台
配置环境
vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1
bash ./vemlp/eval/eval.sh ./vemlp/eval/configs/eval_text2sql.yaml dataset.validation_file=/vemlp-demo-models/datasets-vetuner/Text-to-sql/validation.parquet tokenizer.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B model.pretrained_model_name_or_path=/vemlp-demo-models/demo-vetuner/ckpt/experiments/step-1000
配置资源
选择合适的资源,最佳实践所用机器为单机 1 卡 ml.hpcpni2l。
挂载 SFCS 并配置 AK/SK。
在Terminal中使用以下命令对微调模型性能进行离线评测,具体操作步骤如下。
创建一个 demo-vetuner-validation.yaml 文件。
编辑 yaml 文件,填写镜像、资源规格、环境变量以及入口命令。
运行任务命令。如运行成果,在Terminal会出现 “创建任务成功,task_id=*****” 字样。完整运行时长预计为12分钟左右。
volc ml_task submit --conf=/vemlp-demo-models/demo-vetuner-validation.yaml
demo-vetuner-validation.yaml 文件示例:
TaskName: "interference-with-veTuner-for-llama3" Description: "" Tags: [] ImageUrl: "vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1" ResourceQueueID: "q-**************" #请替换为自己的队列ID # DL framework, support: TensorFlow PS,PyTorch DDP,Horovod,BytePS Framework: "PyTorchDDP" # Flavor代表机型,去 https://www.volcengine.com/docs/6459/72363 查询 TaskRoleSpecs: - RoleName: "worker" RoleReplicas: 1 Flavor: "custom" ResourceSpec: Family: "ml.pni2l" CPU: 105.000 Memory: 1875.000 GPUNum: 1 Envs: - Name: "VETURBOIO_USE_SFCS_SDK" Value: "false" - Name: "AK" Value: "****************" #请替换为自己的AK - Name: "SK" Value: "****************" #请替换为自己的SK - Name: "WANDB_REGION" Value: "cn-beijing" AccessType: "Queue" Storages: - Type: "Sfcs" MountPath: "/vemlp-demo-models" Bucket: "vemlp-demo-models" Prefix: "/" FsName: "****" #请替换为自己的实例名称 CachePolicyId: "****************" #请替换为自己的缓存策略ID SfcsId: "****************" #请替换为自己的SFCSID Entrypoint: | bash ./vemlp/eval/eval.sh ./vemlp/eval/configs/eval_text2sql.yaml dataset.validation_file=/vemlp-demo-models/datasets-vetuner/Text-to-sql/validation.parquet tokenizer.pretrained_model_name_or_path=/vemlp-demo-models/model-llama/Meta-Llama-3.1-8B model.pretrained_model_name_or_path=/vemlp-demo-models/demo-vetuner/ckpt/experiments/step-1000