You need to enable JavaScript to run this app.
导航
使用veTuner与veTurboIO加速Llama-3.1-8B模型在 MLP 的最佳实践
最近更新时间:2024.12.10 11:46:14首次发布时间:2024.12.10 11:46:14

机器学习平台是一套服务于专业算法工程师,整合云原生的工具+算力 (GPU、CPU云服务器),进行一站式AI算法开发和迭代的平台。本方案将为您介绍如何在 MLP 使用 veTuner 与 veTurboIO 加速 Meta-Llama-3.1-8B 模型的微调,并实现离线评测。

使用前提

说明

在实践过程中,如果因网络等问题导致模型、数据集或量化工具等无法下载到 TOS bucket ,建议您可以先将其下载到开发机云盘中,再自行拷贝到 TOS 路径下。

本方案以 Meta-Llama-3.1-8B 模型为例,在开始执行操作前,请确认您已经完成以下准备工作:

步骤一:准备 Llama-3.1-8B 模型
  1. 进入开发机。

    1. 登陆 账号登录-火山引擎

    2. 在左侧导航栏单击开发机,在开发机列表页面中单击待操作的开发机名称,进入对应开发机内。

    3. 通过 SSH 远程登录开发机,具体操作详见通过SSH远程连接开发机--机器学习平台-火山引擎

  2. 配置 volc configure。具体操作详见使用文档--机器学习平台-火山引擎

  3. 在 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路径。

说明

  1. --token/--hf_username/--hf_token等参数非必须,仅为部分 Repo 有 license 限制,需登录申请许可。如果必要,请在 https://huggingface.co/settings/tokens 获取 token 后进行下载。
  2. 推荐您将模型文件、训练数据集的下载、存放地址都设置在 TOS/VEPFS/SCFS 等共享存储内,之后在进行训练、推理等跨节点的任务时,可以更加轻松地挂载到不同的机器上。
步骤二:准备数据集

2.1 数据准备

在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数据集下载路径。

2.2 数据预处理

本方案随机筛选回答较短的 100,000 条数据作为训练集,5,000条数据作为测试集。

  1. 创建 makedataset.py 文件。脚本内容示例如下。
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)
  1. 在开发机内执行 makedataset.py 文件。
python makedataset.py
步骤三:模型训练

最佳实践文档提供控制台与命令行两种方式的操作说明。

方式一:控制台

  1. 进入自定义任务控制台

  2. 配置环境

    1. 在自定义镜像处配置镜像。
    vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1
    
    1. 填写入口命令并定义环境变量。请注意tos在开发机上挂载的路径与自定义任务中挂载的路径不一致,在入口命令填写数据集路径环境变量中填写模型路径时,需确保为自定义任务中挂载的路径。
    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
    

  1. 配置资源

    1. 选择合适的资源,最佳实践所用机器为单机 8 卡 ml.hpcpni2l。

    2. 挂载SFCS并配置AK/SK。

方式二:命令行

在Terminal中使用以下命令对 Llama-3.1-8B 模型进行微调,具体操作步骤如下。

  1. 创建一个 demo-vetuner-train.yaml 文件。

  2. 编辑 yaml 文件,填写镜像、资源规格、环境变量以及入口命令。

  3. 运行任务命令。如运行成果,在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
步骤四:模型离线评测

完成训练后,您可通过离线评测验证微调模型性能。最佳实践文档提供控制台与命令行两种方式的操作说明。

方式一:控制台

  1. 进入自定义任务控制台

  2. 配置环境

    1. 在自定义镜像处配置镜像。
    vemlp-cn-beijing.cr.volces.com/preset-images/vetuner:0.0.1
    
    1. 填写入口命令并定义环境变量。请注意tos在开发机上挂载的路径与自定义任务中挂载的路径不一致,在入口命令填写数据集路径环境变量中填写模型路径时,需确保为自定义任务中挂载的路径。
    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
    

  3. 配置资源

    1. 选择合适的资源,最佳实践所用机器为单机 1 卡 ml.hpcpni2l。

    2. 挂载 SFCS 并配置 AK/SK。

方式二:命令行

在Terminal中使用以下命令对微调模型性能进行离线评测,具体操作步骤如下。

  1. 创建一个 demo-vetuner-validation.yaml 文件。

  2. 编辑 yaml 文件,填写镜像、资源规格、环境变量以及入口命令。

  3. 运行任务命令。如运行成果,在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