Checklist / 检查清单
Question Description / 问题描述
关于姓名和域名等敏感信息用 XXXXX代替
教师部署的模型的命令:
CUDA_VISIBLE_DEVICES=0 swift deploy
--model /code/chenfu01/0models_TagProject/models/Qwen3-8B-XXXX
--model_type qwen3
--template qwen3
--infer_backend vllm
--port 8000
--max_logprobs 64
这个是运行的train.sh脚本
top_k=64
max_prompt_length=2048
max_completion_length=512
max_total_length=$((max_prompt_length + max_completion_length))
export IMAGE_MAX_TOKEN_NUM=1024
echo "当前时间: $(date)"
echo "训练将在 8 小时后停止"
NPROC_PER_NODE=8
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
PYTORCH_CUDA_ALLOC_CONF='expandable_segments:True'
timeout --signal=TERM --kill-after=2m 19h
swift rlhf
--rlhf_type gkd
--tuner_type full
--model /code/敏感信息/llama_factory/train_tasks/model/origin/Qwen3-8B/a80f5e57cce20e57b65145f4213844dec1a80834
--teacher_model_server '[{"url":"http://XXXX 敏感信息","tags":["/code/XXXXX01/0data_TagProject/XXX/traindata/traindata_v0/traindata.jsonl"]},{"url":"http://XXXXXX 敏感信息","tags":["/code/敏感信息/0data_TagProject/XXXX/traindata/traindata_v0/general_traindata.jsonl"]}]'
--gkd_logits_topk $top_k
--model_type qwen3
--template qwen3
--use_vllm false
--sleep_level 0
--deepspeed zero2
--dataset /code/XXXXX01/0data_TagProject/XXXX/traindata/traindata_v0/traindata.jsonl /code/XXXXX01/0data_TagProject/XXXX/traindata/traindata_v0/general_traindata.jsonl
--lmbda 0
--beta 1
--output_dir /code/XXXXX01/0models_TagProject/models/Qwen3-8B-XXXX2
--torch_dtype bfloat16
--per_device_train_batch_size 8
--gradient_accumulation_steps 2
--learning_rate 1e-5
--logging_steps 1
--num_train_epochs 1
--save_total_limit 2
--sft_alpha 1
--max_length $max_prompt_length
--max_completion_length $max_completion_length
--warmup_ratio 0.1
--save_only_model false
--dataloader_num_workers 4
--dataset_num_proc 4
--temperature 1.0
--save_steps 80
--attn_impl flash_attn
--report_to tensorboard
EXIT_CODE=$?
echo "训练结束: $(date)"
if [ $EXIT_CODE -eq 124 ]; then
echo "训练运行满 1 小时,已停止"
elif [ $EXIT_CODE -eq 0 ]; then
echo "训练正常完成"
else
echo "训练异常退出,exit code=$EXIT_CODE"
fi
基本的背景信息:
学生没有学习到 EOS 的信息:
训练的脚本的地址:
/code/XXXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_sever_train_offpolicy.sh
这些是教师模型用的命令:
/code/XXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_XXXX_general.sh
/code/XXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_XXXX_zhubo.sh
Step1:检查教师和学生推理过程的区别?
通过运行/code/XXXXX/1tmp文件夹/eos/复读检查.py,下面是我运行出来的日志
进一步检查分析两个 Teacher 的完整的生成情况,不仅仅包括, 对于教师的生成信息:
=============================================================================
prompt: <|im_start|>user
你需要对XXXXXXXX才艺需求进行判断和标注
【需求】: 语音厅,要求会唱歌会聊天
<|im_end|>
<|im_start|>assistant
=========================================================================
[generation] token_count: 12
[generation] eos_token_id: 151645
[generation] eos_token: '<|im_end|>'
[generation] reached_max_new_tokens: False
[generation] raw: '才艺需求:聊天,才艺需求:唱歌<|im_end|>'
训练出来的参数学生模型的信息:
prompt: <|im_start|>user
你需要对XXXXXXXX才艺需求进行判断和标注
【需求】: 语音厅,要求会唱歌会聊天
<|im_end|>
<|im_start|>assistant
=========================================================================
[generation] token_count: 64
[generation] eos_token_id: None
[generation] eos_token: None
[generation] reached_max_new_tokens: True
[generation] raw: '才艺需求:聊天,才艺需求:唱歌,才艺需求:乐器,才艺需求:跳舞,才艺需求:内容创作,才艺需求:推销,才艺需求:游戏,才艺需求:桌游,才艺需求:聊天,才艺需求:唱歌,才艺'
发现学生运行 eos_token_id 没有学会教师的 EOS 输出的功能。
Step2:排查教师的基本情况,教师模型正常
curl -s --max-time 120 http://XXXXXXXXXXXX/v1/chat/completions
-H 'Content-Type: application/json'
-d '{
"model": "Qwen3-8B-JD",
"messages": [{"role":"user","content":"你需要对XXXXXX才艺需求进行判断和标注 \n \n【需求】: 电商带货主播(带货主播)\n【需求】不露脸直播 一天两场 每场3个小时 有专业人员培训\n"}],
"logprobs": true,
"top_logprobs": 64,
"max_tokens": 30,
"temperature": 0
}' > /tmp/teacher_resp.json 2>&1
echo "HTTP状态: $?"
ls -la /tmp/teacher_resp.json
head -c 5000 /tmp/teacher_resp.json
通过查看/tmp/teacher_resp.json这个文件发现教师模型每一步确实生成了结束符号:
{
"model": "Qwen3-8B-JD",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\n\n\n才艺需求:推销", (根据复读检查.py的检查应该是自带的而非生成的两个 think)
"tool_calls": null,
"reasoning_content": null
},
...
{
"token": "<|im_end|>",
"logprob": -0.0021906918846070766,
"bytes": [
60,
124,
105,
109,
95,
101,
110,
100,
124,
62
],
"top_logprobs": [
{
"token": "<|im_end|>",
"logprob": -0.0021906918846070766,
"bytes": [
60,
124,
105,
109,
95,
101,
110,
100,
124,
62
]
},
}
也就是 KL 训练的时候压根就没有学习到结束符号的的 logits 蒸馏的信息。
深入去 debug 源码:/code/XXXXXX/alims-swift/ms-swift 里面去看
Checklist / 检查清单
Question Description / 问题描述
关于姓名和域名等敏感信息用 XXXXX代替
教师部署的模型的命令:
CUDA_VISIBLE_DEVICES=0 swift deploy
--model /code/chenfu01/0models_TagProject/models/Qwen3-8B-XXXX
--model_type qwen3
--template qwen3
--infer_backend vllm
--port 8000
--max_logprobs 64
这个是运行的train.sh脚本
top_k=64
max_prompt_length=2048
max_completion_length=512
max_total_length=$((max_prompt_length + max_completion_length))
export IMAGE_MAX_TOKEN_NUM=1024
echo "当前时间: $(date)"
echo "训练将在 8 小时后停止"
NPROC_PER_NODE=8
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
PYTORCH_CUDA_ALLOC_CONF='expandable_segments:True'
timeout --signal=TERM --kill-after=2m 19h
swift rlhf
--rlhf_type gkd
--tuner_type full
--model /code/敏感信息/llama_factory/train_tasks/model/origin/Qwen3-8B/a80f5e57cce20e57b65145f4213844dec1a80834
--teacher_model_server '[{"url":"http://XXXX 敏感信息","tags":["/code/XXXXX01/0data_TagProject/XXX/traindata/traindata_v0/traindata.jsonl"]},{"url":"http://XXXXXX 敏感信息","tags":["/code/敏感信息/0data_TagProject/XXXX/traindata/traindata_v0/general_traindata.jsonl"]}]'
--gkd_logits_topk $top_k
--model_type qwen3
--template qwen3
--use_vllm false
--sleep_level 0
--deepspeed zero2
--dataset /code/XXXXX01/0data_TagProject/XXXX/traindata/traindata_v0/traindata.jsonl /code/XXXXX01/0data_TagProject/XXXX/traindata/traindata_v0/general_traindata.jsonl
--lmbda 0
--beta 1
--output_dir /code/XXXXX01/0models_TagProject/models/Qwen3-8B-XXXX2
--torch_dtype bfloat16
--per_device_train_batch_size 8
--gradient_accumulation_steps 2
--learning_rate 1e-5
--logging_steps 1
--num_train_epochs 1
--save_total_limit 2
--sft_alpha 1
--max_length $max_prompt_length
--max_completion_length $max_completion_length
--warmup_ratio 0.1
--save_only_model false
--dataloader_num_workers 4
--dataset_num_proc 4
--temperature 1.0
--save_steps 80
--attn_impl flash_attn
--report_to tensorboard
EXIT_CODE=$?
echo "训练结束: $(date)"
if [ $EXIT_CODE -eq 124 ]; then
echo "训练运行满 1 小时,已停止"
elif [ $EXIT_CODE -eq 0 ]; then
echo "训练正常完成"
else
echo "训练异常退出,exit code=$EXIT_CODE"
fi
基本的背景信息:
学生没有学习到 EOS 的信息:
训练的脚本的地址:
/code/XXXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_sever_train_offpolicy.sh
这些是教师模型用的命令:
/code/XXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_XXXX_general.sh
/code/XXXXX/tag-product-engineering/CF_multi_model_tag/XXXX_tagging/train_model/ModelMerge/teacher_XXXX_zhubo.sh
Step1:检查教师和学生推理过程的区别?
通过运行/code/XXXXX/1tmp文件夹/eos/复读检查.py,下面是我运行出来的日志
进一步检查分析两个 Teacher 的完整的生成情况,不仅仅包括, 对于教师的生成信息:
=============================================================================
prompt: <|im_start|>user
你需要对XXXXXXXX才艺需求进行判断和标注
【需求】: 语音厅,要求会唱歌会聊天
<|im_end|>
<|im_start|>assistant
=========================================================================
[generation] token_count: 12
[generation] eos_token_id: 151645
[generation] eos_token: '<|im_end|>'
[generation] reached_max_new_tokens: False
[generation] raw: '才艺需求:聊天,才艺需求:唱歌<|im_end|>'
训练出来的参数学生模型的信息:
prompt: <|im_start|>user
========================================================================= [generation] token_count: 64 [generation] eos_token_id: None [generation] eos_token: None [generation] reached_max_new_tokens: True [generation] raw: '才艺需求:聊天,才艺需求:唱歌,才艺需求:乐器,才艺需求:跳舞,才艺需求:内容创作,才艺需求:推销,才艺需求:游戏,才艺需求:桌游,才艺需求:聊天,才艺需求:唱歌,才艺'你需要对XXXXXXXX才艺需求进行判断和标注
【需求】: 语音厅,要求会唱歌会聊天
<|im_end|>
<|im_start|>assistant
发现学生运行 eos_token_id 没有学会教师的 EOS 输出的功能。
Step2:排查教师的基本情况,教师模型正常
curl -s --max-time 120 http://XXXXXXXXXXXX/v1/chat/completions
-H 'Content-Type: application/json'
-d '{
"model": "Qwen3-8B-JD",
"messages": [{"role":"user","content":"你需要对XXXXXX才艺需求进行判断和标注 \n \n【需求】: 电商带货主播(带货主播)\n【需求】不露脸直播 一天两场 每场3个小时 有专业人员培训\n"}],
"logprobs": true,
"top_logprobs": 64,
"max_tokens": 30,
"temperature": 0
}' > /tmp/teacher_resp.json 2>&1
echo "HTTP状态: $?"
ls -la /tmp/teacher_resp.json
head -c 5000 /tmp/teacher_resp.json
通过查看/tmp/teacher_resp.json这个文件发现教师模型每一步确实生成了结束符号:
{
"model": "Qwen3-8B-JD",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\n\n\n才艺需求:推销", (根据复读检查.py的检查应该是自带的而非生成的两个 think)
"tool_calls": null,
"reasoning_content": null
},
...
{
"token": "<|im_end|>",
"logprob": -0.0021906918846070766,
"bytes": [
60,
124,
105,
109,
95,
101,
110,
100,
124,
62
],
"top_logprobs": [
{
"token": "<|im_end|>",
"logprob": -0.0021906918846070766,
"bytes": [
60,
124,
105,
109,
95,
101,
110,
100,
124,
62
]
},
}
也就是 KL 训练的时候压根就没有学习到结束符号的的 logits 蒸馏的信息。
深入去 debug 源码:/code/XXXXXX/alims-swift/ms-swift 里面去看