ChatGLM2-6B创作广告

更新时间:

本案例以 “ChatGLM2-6B” 模型为例,指导如何使用平台的 离线训练 功能对模型进行强化训练,使其拥有我们想要的能力,本例主要是使用大量广告词来对 ChatGLM2-6B 进行专项训练,使其具备广告词创作的能力。
其他模型的强化训练步骤类似,可参考本案例操作。

# 前提条件

已体验 部署ChatGLM2-6B

# 查看原模型的广告生成

了解原始 ChatGLM2-6B 的广告词生成能力,以便与专项训练后的能力形成对比。

  1. 进入 ChatGLM2-6B体验 的项目详情。

  2. 进入 ChatGLM2-6B体验 项目的开发环境。

  3. 顶部切换至 网页终端

  4. 网页终端中执行如下命令,创建一个 json 文件并填入想生成广告的衣物的特性(content)。

    touch /gemini/code/test.json
    echo '{"content": "类型#裙*材质#网纱*图案#蝴蝶结*裙下摆#层叠*裙长#半身裙*裙衣门襟#系带", "summary": "层叠网纱,仙气飘飘,却不会过于膨胀。腰间的蝴蝶结系带,恰到好处的增添了柔美感。膝盖以下,长度刚刚好的半身裙,比起“一览无遗魅力尽显”,专注于“完美隐藏”"}' > /gemini/code/test.json
    
  5. 执行如下命令进行推理。

    使用自己准备的代码,需相应修改第一行中 main.py 的路径。

    torchrun --standalone --nnodes=1 --nproc-per-node=1 /gemini/code/ChatGLM2-6B/ptuning/main.py \
    --do_predict \
    --validation_file /gemini/code/test.json \
    --test_file /gemini/code/test.json \
    --model_name_or_path /gemini/pretrain \
    --output_dir /gemini/code/adgen01 \
    --overwrite_cache \
    --prompt_column content \
    --response_column summary \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_eval_batch_size 1 \
    --predict_with_generate \
    --pre_seq_len 128 \
    --quantization_bit 4
    

    最终返回如下信息,则执行完成。

    08/11/2023 15:30:42 - DEBUG - jieba - Prefix dict has been built successfully.
    100%|██████████████████████████████████████████████████████████████████████████████████| 1/1    [00:00<00:00,  1.57it/s]
    ***** predict metrics *****
      predict_bleu-4             =     0.2325
      predict_rouge-1            =     8.1633
      predict_rouge-2            =        0.0
      predict_rouge-l            =     6.7797
      predict_runtime            = 0:00:44.41
      predict_samples            =          1
      predict_samples_per_second =      0.023
      predict_steps_per_second   =      0.023
    root@3c6cecd2d1ea73c792d2eea7b32b3922-taskrole1-0:/gemini/code# 
    
  6. 使用 JupyterLab 查看 /gemini/code/adgen01/generated_predictions.txt 中的 predict 字段。
    该字段即是原始模型根据 类型#裙*材质#网纱*图案#蝴蝶结*裙下摆#层叠*裙长#半身裙*裙衣门襟#系带 生成的广告词。

  7. 单击右上角 停止 按钮,停止开发环境。

# 提交离线训练

使用已挂载到项目的数据(即 AdvertiseGen 数据集中的 dev.json 和 train.json 文件)对 ChatGLM2-6B 进行专项训练。文件中包含标记好的各物品及其特征(content)和对应的标准广告词(summary),让 chatglm2-6b 根据输入(content)生成一段广告词并与标答(summary)比对,从而不断修正优化,直到最终能够根据输入生成较为贴切的广告词。

  1. 单击顶部项目名,回到项目详情页。

  2. 单击项目详情页右上角 离线任务,进入离线任务页。

  3. 单击右上角 提交任务 按钮。

  4. 参考如下说明配置任务基本信息,其他参数保持默认值。

    • 任务名称:自定义,如:chatglm2-6B-train

    • 代码:挂载。

    • 数据:保持默认。

    • 模型:保持默认。

    • 任务模式:选择 单机任务

    • 资源配置:选择 高级版P1.large

    • 启动命令:填写如下启动命令,系统将在创建好训练环境后通过如下命令启动训练。

      torchrun --standalone --nnodes=1 --nproc-per-node=1 /gemini/code/ChatGLM2-6B/ptuning/main.py \
          --do_train \
          --train_file $GEMINI_DATA_IN1/train.json \
          --validation_file $GEMINI_DATA_IN1/dev.json \
          --model_name_or_path $GEMINI_PRETRAIN \
          --output_dir $GEMINI_DATA_OUT/adgen-chatglm2-6b-pt-128-2e-2 \
          --preprocessing_num_workers 10 \
          --prompt_column content \
          --response_column summary \
          --overwrite_cache \
          --overwrite_output_dir \
          --max_source_length 64 \
          --max_target_length 128 \
          --per_device_train_batch_size 1 \
          --per_device_eval_batch_size 1 \
          --gradient_accumulation_steps 16 \
          --predict_with_generate \
          --max_steps 100 \
          --logging_steps 10 \
          --save_steps 50 \
          --learning_rate 2e-2 \
          --pre_seq_len 128 \
          --quantization_bit 4
      

      上述命令指执行 main.py 脚本启动训练,其中,

      • --train_file:指定训练数据为 $GEMINI_DATA_IN1/train.json
      • --validation_file:指定验证数据为 $GEMINI_DATA_IN1/dev.json
      • --model_name_or_path:预训练模型为 $GEMINI_DATA_IN2 中的 chatglm2-6b 模型。
      • --output_dir:指定训练结果保存在 $GEMINI_DATA_OUT 目录下。
    • 工作镜像:保持默认。

  5. 单击 提交,返回 离线任务 页面。
    等待任务状态为 成功 ,则训练完成。

# 查看训练结果

将训练结果导出为模型,并将其挂载到开发环境中,在开发环境中加载训练后的模型并用其对 test.json 进行推理,看看经过专项训练后的模型是否会生成更好的广告词。

# 【A】导出为模型

  1. 项目详情中切换到 任务输出 页。

  2. 单击右上方 导出,随后勾选文件夹,并单击 导出为模型

  3. 填写模型导出信息。

    • 模型名称:可自定义,如 chatglm2-6b-AD
    • 模型描述:保持默认。
    • 模型文件:保持默认。
    • 模型格式:保持默认。
    • 标签:保持默认。
    • 公开性:保持默认。

  4. 单击 创建,等待导出成功的提示。

# 【B】挂载到开发环境

  1. 项目详情右边栏的 配置 页中,单击模型的 修改
    chatglm-6_modifyModel

  2. 选择刚才导出的模型 chatglm2-6b-AD,并单击 确认

  3. 单击右上角 启动开发环境,等待开发环境启动完成。

# 【C】推理

  1. 单击项目详情页右上角 进入开发环境

  2. 切换到 网页终端

  3. 执行如下命令,使用训练后的模型推理此前推理过的 test.json

    torchrun --standalone --nnodes=1 --nproc-per-node=1 /gemini/code/ChatGLM2-6B/ptuning/main.py \
    --do_predict \
    --validation_file /gemini/code/test.json \
    --test_file /gemini/code/test.json \
    --model_name_or_path /gemini/pretrain \
    --ptuning_checkpoint /gemini/pretrain2/adgen-chatglm2-6b-pt-128-2e-2/checkpoint-100 \
    --output_dir /gemini/code/adgen02 \
    --overwrite_cache \
    --prompt_column content \
    --response_column summary \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_eval_batch_size 1 \
    --predict_with_generate \
    --pre_seq_len 128 \
    --quantization_bit 4
    

    等待执行完成。

  4. 查看 /gemini/code/adgen02/generated_predictions.txt 中的 predict 字段。
    该字段即为训练后的模型根据 类型#裙*材质#网纱*图案#蝴蝶结*裙下摆#层叠*裙长#半身裙*裙衣门襟#系带 生成的广告词。

# 【D】结果对比

/gemini/code/ 路径下的 adgen01、adgen02 分别是原始模型的推理结果和强化训练后的模型推理结果,对比它们 generated_predictions.txt 中的 predict 字段。

  • 原始模型:这是一条纯文本内容的AI裙,没有任何代码段落。
  • 强化训练后:这款半身裙采用网纱材质,穿着舒适,透气性好,适合夏季穿着。裙摆是层叠的设计,可以修饰腿部线条,展现女性的曲线美。裙下摆是蝴蝶结的装饰,搭配系带,方便上穿,简单大方。

可见,针对同一个输入,强化后的模型生成的广告词更加流畅具有美感,和训练所用数据中的 summary 的风格比较贴近,而原始模型生成的广告词则生硬甚至无逻辑。