从零开始的 CPT (Continual Pre-Training): 摆脱复杂的训练框架

由于要解决一些业务问题,需要将领域知识喂给大模型。之前只做过简单的 finetuning(在 GLM 的框架上跑了一些 lora,数据量也不大),但是现在要将整个细分工业领域的相关数据都收集起来训练,规模上比之前半手动构造的微调数据集要大了很多,调研了一圈,更适合在 pre-train 阶段去做训练。

尝试使用训练框架:

  • LLaMA Factory
    是的,大名鼎鼎的 LLaMA Factory 不仅能 finetune,还能做 pre-train 阶段的训练。这个还是阿里的朋友告知才知道的...
  • GPT-NeoX
    高性能训练框架。人家 Readme 中就提醒了,心里没点数别来用我:

If you are not looking to train models with billions of parameters from scratch, this is likely the wrong library to use.

  • Pai-Megatron-Patch
    跟 GPT-NeoX 一样是基于 Megatron 的训练框架,不过感觉阿里除了 antd 就没啥好用的开源项目...

说实话,这些框架的使用配置还是有些复杂(对于我这样的 pre-train 菜鸟来说),光是看文档就能把自己绕进去。

当然 LLaMA Factory 的使用还是比较傻瓜式的,毕竟是有 UI 操作界面的,点点点就能把最终运行的 command line 拼出来,就是它在产品的设计上完全是为了 finetune 而生的,感觉完全没有考虑 pre-train 这个 feature。比如 stage 选项中,pre-train 是排在最下面的;我明明选的是 pre-train,无论是训练开始前的命令行预览,还是训练的结果保存路径,都包含了 lora 是怎么回事?一头雾水,文档也不清楚。

那有没有可能不使用这些高大上的训练框架呢?我只想简简单单验证一下技术可行性,那只能从 transformer 库入手了。

首先,初始化 model 和 tokenizer:

    model_name = os.path.join(
        "/home/ubuntu/ycd/pretrained_models", "Qwen2.5-Coder-0.5B-Instruct"
    )

    output_dir = os.path.join("models", "qwen2.5-coder")
    model = AutoModelForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)

加载数据并 token 化:

    raw_datasets = load_dataset(data_files="/home/ubuntu/ycd/continual-pretrain-qwen2.5-coder/data")
    def tokenize_function(example):
        return tokenizer(example["text"], truncation=True, padding=True)
    tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)

配置训练参数,这里除了 output_dir 是必填项,其他都可以使用默认值,不过数据集中的 column 名称要指定一下 text,否则默认回去找 label 字段,找不到会报错。

    training_args = TrainingArguments(
        output_dir=output_dir,
        label_names=["text"],
        # num_train_epochs=3,
        # per_device_train_batch_size=4,
        # save_steps=10_000,
        # save_total_limit=2
    )

使用 Trainer 启动训练:

    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_datasets,
        tokenizer=tokenizer,
    )
    trainer.train()

简单验证一下推理效果,zero-shot 可以生成 AFSIM 脚本代码,说明已经学到了训练数据中的知识
image

不过在 Qwen2.5-coder 0.5B 的模型上,会出现复读机的效果,用 3B 的模型倒是没有出现了。
image

后续还要继续加强训练数据质量的处理。并且这次的训练中,数据主要是 AFSIM 的相关代码,需要增加 C++/C# 等不同类型的数据进行一定比例的配比。

posted @   zion03  阅读(175)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示