使用 API 或命令行进行模型微调

本文档以通义千问模型的微调操作为例进行说明,使用命令行(Shell)和 API (HTTP)两种方式,帮助您使用百炼提供的模型微调功能。

前提条件

  • 您已经完整阅读了模型调优,熟悉如何在百炼平台进行模型微调的基本步骤,并掌握了微调数据集构建技巧。

  • 已开通服务并获得API-KEY, 请参考获取API Key

  • 已导入 API-KEY,请参考配置API Key到环境变量

  • (可选,仅 Shell 需要)已安装 DashScope SDK,请参考DashScope SDK

上传训练文件

准备训练文件

SFT 训练集

SFT ChatML(Chat Markup Language)格式训练数据,支持多轮对话和多种角色设置,一行训练数据展开后结构如下

{"messages": [
  {"role": "system", "content": "<系统输入1>"}, 
  {"role": "user", "content": "<用户输入1>"}, 
  {"role": "assistant", "content": "<模型期望输出1>"}, 
  {"role": "user", "content": "<用户输入2>"}, 
  {"role": "assistant", "content": "<模型期望输出2>"}
  ...
  ...
  ...
  ]
}

system/user/assistant 区别请参见消息类型

不支持OpenAI 的nameweight参数,所有的 assistant 输出都会被训练。

训练数据集样例:

SFT-ChatML格式示例.jsonl

SFT 图像理解训练集

SFT图像理解 ChatML 格式训练数据(图片文件会与文本训练数据在同一目录下一起打包成 zip),一行训练数据展开后结构如下

{"messages":[
  {"role":"user",
    "content":[
      {"text":"<用户输入1>"},
      {"image":"<图像文件名1>"}]},
  {"role":"assistant",
    "content":[
      {"text":"<模型期望输出1>"}]},
  {"role":"user",
    "content":[
      {"text":"<用户输入2>"}]},
  {"role":"assistant",
    "content":[
      {"text":"<模型期望输出2>"}]},
  ...
  ...
  ...
 ]}

system/user/assistant 区别请参见消息类型

不支持OpenAI 的nameweight参数,所有的 assistant 输出都会被训练。

image

训练数据集样例:

SFT 图像理解训练集示例.zip

DPO 数据集

DPO ChatML 格式训练数据,一行训练数据展开后结构如下

{"messages":[
  {"role":"system","content":"<系统输入>"},
  {"role":"user","content":"<用户输入1>"},
  {"role":"assistant","content":"<模型输出1>"},
  {"role":"user","content":"<用户输入2>"},
  {"role":"assistant","content":"<模型输出2>"},
  {"role":"user","content":"<用户输入3>"}],
 "chosen":
   {"role":"assistant","content":"<赞同的模型期望输出3>"},
 "rejected":
   {"role":"assistant","content":"<反对的模型期望输出3>"}}

模型将 messages 内的所有内容均作为输入,DPO 用于训练模型对"<用户输入3>"的正负反馈。

system/user/assistant 区别请参见消息类型

训练数据集样例:

DPO ChatML格式样例.jsonl

您也可以前往百炼控制台下载数据模板。

image

训练文件上传至百炼

Shell

一次调用只能上传一个文件
dashscope files.upload -f '<替换为训练数据集的本地文件路径>' -p fine_tune -d 'training dataset'

image

SFT、DPO 数据集支持 .jsonl 文件;SFT图像理解训练集支持 .zip 压缩包。

使用限制:

  • 单个文件大小最大为300MB

  • 有效文件(未删除)总使用空间配额为5GB

  • 有效文件(未删除)总数量配额为100

返回结果:

Upload success, file id: 976bd01a-f30b-4414-86fd-50c54486e3ef

HTTP

Windows CMD 请将${DASHSCOPE_API_KEY}替换为 %DASHSCOPE_API_KEY%,PowerShell 请替换为 $env:DASHSCOPE_API_KEY
curl --location --request POST \
'https://dashscope.aliyuncs.com/api/v1/files' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--form 'files=@"./qwen-fine-tune-sample.jsonl"' \
--form 'descriptions="a sample fine-tune data file for qwen"'

使用限制:

  • 单个文件大小最大为300MB

  • 所有有效文件(未删除)总使用空间配额为5GB

  • 所有有效文件(未删除)总数量配额为100

更多详细信息请参见模型微调文件管理服务

返回结果

{
  "request_id":"xx",
  "data":{
    "uploaded_files":[{
      "file_id":"976bd01a-f30b-4414-86fd-50c54486e3ef",
      "name":"qwen-fine-tune-sample.jsonl"}],
   "failed_uploads":[]}
 }

模型微调

创建微调任务

Shell

dashscope fine_tunes.call -m qwen-turbo -t '<替换为训练数据集的file_id1>' '<替换为训练数据集的file_id2>' \
--mode sft -b 16 -e 1 -l 1.6e-5 \
--hyper_parameters split=0.9 warmup_ratio=0.0 eval_steps=1

image

微调指令进程将持续监控输出模型微调的日志

image

微调指令进程即使在微调结束后也不会自动关闭,可以随时终止微调指令进程,不会影响百炼平台上的模型微调任务。

您可以使用后续介绍的命令或前往控制台查看当前任务状态并获取微调任务日志。

HTTP

Windows CMD 请将${DASHSCOPE_API_KEY}替换为 %DASHSCOPE_API_KEY%,PowerShell 请替换为 $env:DASHSCOPE_API_KEY
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{
    "model":"qwen-turbo",
    "training_file_ids":[
        "<替换为训练数据集的file_id1>",
        "<替换为训练数据集的file_id2>"
    ],
    "hyper_parameters":{
        "n_epochs":1,
        "batch_size":16,
        "learning_rate":"1.6e-5",
        "split":0.9,
        "warmup_ratio":0.0,
        "eval_steps":1
    },
    "training_type":"sft"
}'

字段

必选

类型

传参方式

描述

training_file_ids

Array

Body

训练集文件列表。

validation_file_ids

Array

Body

验证集文件列表。

model

String

Body

用于微调的基础模型 ID,或其他微调任务产出的模型 ID。

hypter_parameters

Map

Body

用于微调模型的超参数,缺失该参数时系统会使用默认值进行微调。

training_type

String

Body

训练方法,可选值为:

sft

efficient_sft

dpo_full

dpo_lora

返回结果

{
    "request_id":"8ee17797-028c-43f6-b444-0598d6bfb0f9",
    "output":{
        "job_id":"ft-202410121111-a590",
        "job_name":"ft-202410121111-a590",
        "status":"PENDING",
        "model":"qwen-turbo",
        "base_model":"qwen-turbo",
        "training_file_ids":[
            "976bd01a-f30b-4414-86fd-50c54486e3ef"],
      "validation_file_ids":[],
      "hyper_parameters":{
          "n_epochs":1,
          "batch_size":16,
          "learning_rate":"1.6e-5",
          "split":0.9,
          "warmup_ratio":0.0,
          "eval_steps":1},
      "training_type":"sft",
      "create_time":"2024-10-12 11:55:45",
      "user_identity":"1396993924585947",
      "modifier":"1396993924585947",
      "creator":"1396993924585947",
      "group":"llm"
    }
}

-m/--model/"model"(必选)支持的基础模型 ID 列表与--mode/"training_type"(可选)支持情况:

--mode默认值为sft,如果未声明--model且模型不支持sft方法,微调任务将会失败。

模型名称

模型代码

SFT全参训练

(sft)

SFT高效训练

(efficient_sft)

DPO全参训练

(dpo_full)

DPO高效训练

(dpo_lora)

通义千问2.5-开源版-72B

qwen2.5-72b-instruct

hailuo_652023034_RF

hailuo_652023034_RF

通义千问2.5-开源版-32B

qwen2.5-32b-instruct

hailuo_652023034_RF

通义千问2.5-开源版-14B

qwen2.5-14b-instruct

hailuo_652023034_RF

hailuo_652023034_RF

通义千问2-开源版-72B

qwen2-72b-instruct

hailuo_652023034_RF

hailuo_652023034_RF

通义千问2-开源版-7B

qwen2-7b-instruct

hailuo_652023034_RF

hailuo_652023034_RF

hailuo_652023034_RF

hailuo_652023034_RF

通义千问1.5-开源版-72B

qwen1.5-72b-chat

hailuo_652023034_RF

通义千问1.5-开源版-14B

qwen1.5-14b-chat

hailuo_652023034_RF

hailuo_652023034_RF

通义千问1.5-开源版-7B

qwen1.5-7b-chat

hailuo_652023034_RF

hailuo_652023034_RF

通义千问-开源版-72B

qwen-72b-chat

hailuo_652023034_RF

通义千问-开源版-14B

qwen-14b-chat

hailuo_652023034_RF

hailuo_652023034_RF

通义千问-开源版-7B

qwen-7b-chat

hailuo_652023034_RF

hailuo_652023034_RF

通义千问-Turbo(通义商业版)

qwen-turbo

hailuo_652023034_RF

hailuo_652023034_RF

通义千问-Turbo-0624(通义商业版)

qwen-turbo-0624

hailuo_652023034_RF

hailuo_652023034_RF

hailuo_652023034_RF

hailuo_652023034_RF

通义千问-Plus-0723(通义商业版)

qwen-plus-0723

hailuo_652023034_RF

hailuo_652023034_RF

通义千问VL-Max-0201

qwen-vl-max-0201

hailuo_652023034_RF

通义千问VL-Plus

qwen-vl-plus

hailuo_652023034_RF

百川2-7B(开源)

baichuan2-7b-chat-v1

hailuo_652023034_RF

Llama2-13B

llama2-13b-chat-v2

hailuo_652023034_RF

Llama2-7B

llama2-7b-chat-v2

hailuo_652023034_RF

ChatGLM2-6B

chatglm-6b-v2

hailuo_652023034_RF

常用超参:

超参名称

默认设置

推荐设置

超参作用

循环次数

-e

--n_epochs

"n_epochs"

1

数据量 < 10,000, 循环 3~5

数据量 > 10,000, 循环 1~2

具体需要结合实验效果进行判断

模型遍历训练的次数,请根据模型调优实际使用经验进行调整。

模型训练循环次数越多,训练时间越长,训练费用越高。

学习率

-l

--learning_rate

"learning_rate"

sft/dpo_full/dpo_lora: 1e-5 量级

efficient_sft:1e-4 量级

具体数值随模型选择变化。

使用默认值

控制模型修正权重的强度。

如果学习率设置得太高,模型参数会剧烈变化,导致微调后的模型表现不一定更好,甚至变差;

如果学习率太低,微调后的模型表现不会有太大变化。

批次大小

-b

--batch_size

"batch_size"

具体数值随模型选择变化。模型越大,默认 batch_size 越小。

使用默认值

一次性送入模型进行训练的数据条数,参数过小会显著延长训练时间,推荐使用默认值。

-p/--ptompt_loss参数无效

NA

NA

NA

--hyper_parameters可接受参数(全部微调类型)

超参名称

默认设置

推荐设置

超参作用

split

(训练集在训练文件中占比)

0.8

使用默认值

当不设置-v/--validation_file_ids/"validation_file_ids"时,百炼会自动把训练文件中的80%作为训练集,20%作为验证集。

max_split_val_dataset_sample

(验证集数据最大数量)

1000

使用默认值

当不设置-v/--validation_file_ids/"validation_file_ids"时,百炼自动分割的验证集最多只有1000条。

lr_scheduler_type

(学习率调整策略)

cosine

推荐“linear”或“Inverse_sqrt”

在模型训练中动态调整学习率的策略。

各策略详情请参考学习率调整策略介绍

eval_steps(验证步数)

50

根据需求调整

训练阶段针对模型的验证间隔步长,用于阶段性评估模型训练准确率、训练损失。

该参数影响模型调优进行时的 Validation Loss 和 Validation Token Accuracy 的显示频率。

max_length(序列长度)

2048

8192

指的是单条训练数据 token 支持的最大长度。如果单条数据 token 长度超过设定值,微调会直接丢弃该条数据,不进行训练。

字符与 token 之间的关系请参考Token和字符串之间怎么换算

warmup_ratio(学习率预热比例)

0.05

使用默认值

学习率预热占用总的训练过程的比例。学习率预热是指学习率在训练开始后由一个较小值线性递增至学习率设定值。

该参数主要是限制模型参数在训练初始阶段的变化幅度,从而帮助模型更稳定地进行训练。

比例过大效果与过低的学习率相同,会导致微调后的模型表现不会有太大变化。

比例过小效果与过高的学习率相同,可能导致微调后的模型表现不一定更好,甚至变差。

该参数仅对学习率调整策略“Constant”无效。

weight_decay(权重衰减)

0.1

使用默认值

L2正则化强度。L2正则化能在一定程度上保持模型的通用能力。数值过大会导致模型微调效果不明显。

max_grad_norm(梯度裁剪)

1

使用默认值

梯度裁剪的最大值,用于防止参数微调时剧烈变化导致的微调失败。数值过大可能会导致微调失败,数值过小会导致模型微调效果不明显。

logging_steps(日志显示步数)

5

根据需求调整

微调日志打印的步数。

--hyper_parameters可接受参数(仅efficient_sft/dpo_lora生效)

超参名称

默认设置

推荐设置

超参作用

lora_rank(LoRA秩值)

8

64

LoRA训练中的低秩矩阵的秩大小。秩越大调优效果会更好一点,但训练会略慢。

lora_alpha(LoRA阿尔法)

32

使用默认值

用于控制原模型权重与LoRA的低秩修正项之间的结合缩放系数。

较大的Alpha值会给予LoRA修正项更多权重,使得模型更加依赖于微调任务的特定信息;

而较小的Alpha值则会让模型更倾向于保留原始预训练模型的知识。

lora_dropout(LoRA丢弃率)

0.1

使用默认值

LoRA训练中的低秩矩阵值的丢弃率。

使用推荐数值能增强模型通用化能力。

数值过大会导致模型微调效果不明显。

target_modules(LoRA目标模块)

AUTO

推荐设置为 ALL

选择模型的全部或特定模块层进行微调优化。

ALL是对所有的参数都加上 LoRA 训练;

AUTO是指对模型的关键参数加上 LoRA 训练。

获取微调后模型 ID &查看微调任务状态

在上一步的response中获取到的job_id字段,为本次模型微调任务的ID,您可以使用该ID来查询此模型微调任务的状态。

Shell

dashscope fine_tunes.get -j <替换为您的微调任务 id>

任务状态

含义

PENDING

训练待开始。

QUEUING

训练正在排队(同时只有一个训练任务可以进行)

RUNNING

训练正在进行中。

CANCELING

训练正在取消中。

success

训练成功。

failed

训练失败。

canceled

训练已经取消。

训练成功返回结果:

Fine-tune task success, fine-tuned model : qwen-turbo-ft-202410121111-a590

qwen-turbo-ft-202410121111-a590为微调成功后的模型 ID。

如果训练失败,请使用下述“查看微调的日志”命令获取错误日志。

HTTP

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'

任务状态

含义

PENDING

训练待开始。

QUEUING

训练正在排队(同时只有一个训练任务可以进行)

RUNNING

训练正在进行中。

CANCELING

训练正在取消中。

SUCCEEDED

训练成功。

FAILED

训练失败。

CANCELED

训练已经取消。

训练成功返回结果:

{
    "request_id":"c8b1d650-498e-432b-9346-c591e34e9622",
    "output":{
        "job_id":"ft-202410121111-a590",
        "job_name":"ft-202410121111-a590",
        "status":"SUCCEEDED",
        "finetuned_output":"qwen-turbo-ft-202410121111-a590",
        "model":"qwen-turbo",
        "base_model":"qwen-turbo",
        "training_file_ids":[
            "976bd01a-f30b-4414-86fd-50c54486e3ef"],
        "validation_file_ids":[],
        "hyper_parameters":{
            "n_epochs":1,
            "batch_size":16,
            "learning_rate":"1.6e-5",
            "split":0.9,
            "warmup_ratio":0.0,
            "eval_steps":1},
        "training_type":"sft",
        "create_time":"2024-10-12 11:43:09",
        "user_identity":"1396993924585947",
        "modifier":"1396993924585947",
        "creator":"1396993924585947",
        "end_time":"2024-10-12 13:20:33",
        "group":"llm",
        "usage":3518670
    }
}

训练成功后,"finetuned_output"指的是微调成功后的模型 ID。

查看微调的日志

Shell

dashscope fine_tunes.stream -j <替换为您的微调任务 id>

如果微调未完成,指令进程将持续监控输出模型微调的日志。

如果微调已完成,将全量输出模型微调的日志。

HTTP

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>/logs?offset=0&line=1000' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' 

训练成功返回结果:

{
    "request_id":"1100d073-4673-47df-aed8-c35b3108e968",
    "output":{
        "total":57,
        "logs":[
            "<输出微调日志1>",
            "<输出微调日志2>",
            ...
            ...
            ...
        ]
    }
}

模型微调的更多操作(可选)

列举微调任务列表

dashscope fine_tunes.list
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' 

中止微调任务

智能终止正在训练中的微调任务
dashscope fine_tunes.cancel -j <替换为您的微调任务 id>
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>/cancel' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' 

删除微调任务

无法删除正在训练中的微调任务
dashscope fine_tunes.delete -j <替换为您的微调任务 id>
curl --location --request DELETE 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' 

API 参考

DashScope 命令行调用参考已包含在本篇内容中,API 调用请参考API 详情

模型部署&调用

模型部署

将微调任务成功后的模型 ID 作为创建模型服务的model_name参数。

更多模型部署的相关信息等请参考:模型部署-快速开始

Shell

dashscope deployments.call -c 2 -m <替换为微调任务成功后的模型 ID>

部署指令进程将持续监控输出模型部署的日志

部署指令进程即使在微调结束后也不会自动关闭,可以随时终止部署指令进程,这不会影响百炼平台上的模型部署任务。

image

红框内为部署的模型实例 ID。

您可以使用后续介绍的命令或前往控制台查看当前部署任务状态。

HTTP

Windows CMD 请替换为 %DASHSCOPE_API_KEY%,PowerShell 请替换为 $env:DASHSCOPE_API_KEY
curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{ "model_name": "<替换为微调任务成功后的模型 ID>", "capacity":2}'

返回结果:

{
    "request_id":"865d7bd0-3f8f-4937-ad40-66361e6bc617",
    "output":{
        "deployed_model":"qwen-turbo-ft-202410121142-b631",
        "gmt_create":"2024-10-12T15:59:55.494",
        "gmt_modified":"2024-10-12T15:59:55.494",
        "status":"PENDING",
        "model_name":"qwen-turbo-ft-202410121142-b631",
        "base_model":"qwen-turbo",
        "base_capacity":2,
        "capacity":2,
        "ready_capacity":0,
        "workspace_id":"llm-3z7uw7fwz0ve65pt",
        "charge_type":"post_paid",
        "creator":"1396993924585947",
        "modifier":"1396993924585947"
    }
}

其中"deployed_model"为部署的模型实例 ID。

查询模型部署的状态

当部署状态为RUNNING时,表示该模型当前可供调用。

dashscope deployments.get -d <替换为部署任务成功后的模型实例 ID>
curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments/<替换为部署任务成功后的模型实例 ID>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY}  \
--header 'Content-Type: application/json' 

更多模型部署相关的操作,如扩缩容、下线等请参考:模型部署-API详情

模型调用

当模型部署状态为RUNNING时,您可以像调用其他模型一样使用微调后的模型。

更多使用方法和参数设置请前往DashScope API 参考

dashscope generation.call -m <替换为部署任务成功后的模型实例 ID> -p '你是谁?'
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY}  \
--header 'Content-Type: application/json' \
--data '{
    "model": "<替换为部署任务成功后的模型实例 ID>",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": "你是谁?"
            }
        ]
    },
    "parameters": {
        "result_format": "message"
    }
}'

模型评测

百炼的模型评测功能必须使用控制台,请前往百炼的模型评测评估模型训练效果,相关信息请参见模型评测