Skip to content

GKD 的离线蒸馏没有办法学习 结束符号的 logits #10282

Description

@wodeai192

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 里面去看

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions