一.概述

本教程旨在帮助用户快速上手使用 DeepSeek Coder 模型进行编码任务的微调与应用,特别是使用 nickrosh/Evol-Instruct-Code-80k-v1 数据集进行训练与推理。

DeepSeek Coder 是基于大量代码数据和指令数据训练的编码语言模型,支持多种编程语言,能够执行代码补全、生成和修复等任务。本教程将指导用户完成从环境配置、数据准备、模型训练到推理预测的全过程。无论是初学者还是有一定经验的研究人员,都能通过本教程快速掌握 DeepSeek Coder 模型的使用,并能够在自己的项目中进行定制化训练和预测。

本教程使用:

数据集:nickrosh/Evol-Instruct-Code-80k-v1 数据集

训练模型:DeepSeek Coder 预训练模型(deepseek-ai/deepseek-coder-6.7b-instruct)

通过本教程,用户将:

  • 学会如何准备训练数据,使用相应脚本生成任务指令数据集
  • 配置训练环境,使用相关命令进行模型微调
  • 了解如何下载和加载预训练的模型权重,以及如何利用 Download.py 脚本进行模型和分词器的下载
  • 熟悉训练过程中所需的参数设置,如何进行模型训练和评估

本教程适合希望快速上手 DeepSeek Coder 模型的开发者和研究人员,帮助用户在实际应用中进行定制化微调和任务推理。

二.快速开始

2.1 环境准备

本教程运行硬件环境:

类别 详细信息
CPU 96 vCPU Intel(R) Xeon(R) Platinum 8481C
GPU *RTX 4090D 8**
GPU 显存 24GB
CUDA 版本 12.1
操作系统 Linux 5.15.0-94-generic
Python 版本 3.10.15
PyTorch 版本 2.4.1

创建一个 conda 环境 deepseek ,并激活环境

conda create -n deepseek python=3.10
conda activate deepseek

2.2 从资源站下载实例源码

mkdir run-deepseek
cd run-deepseek
# 从aheadai资源站下载资源包
wget https://mirrors.aheadai.cn/scripts/DeepSeek_example.zip

解压资源包

unzip DeepSeek_example.zip 
cd DeepSeek_example

确保解压后文件结构如下:

./DeepSeek_example/
    ├── Datasets/                 # 微调数据保存文件夹,存放下载的数据
    ├── Model/                    # 配置保存文件夹,存放下载的模型配置、分词器配置等
    ├── Download.py               # 脚本文件,用于下载分词器配置、模型权重、微调数据并处理数据
    ├── finetune                  # 辅助微调文件夹,包含脚本,支持DeepSpeed 
    ├── Test.py                   # 测试脚本,测试配置文件及分词器下载成功与否
    ├── Train.py                  # 训练脚本,主训练文件,包含模型微调训练的具体实现
    └── requirements.txt          # 依赖文件,列出项目所需的Python库和包

2.3 安装其他依赖

pip install --timeout=9999 -r requirements.txt --index-url https://pypi.mirrors.ustc.edu.cn/simple
pip install --upgrade huggingface_hub transformers --index-url https://pypi.mirrors.ustc.edu.cn/simple
pip install --timeout=9999 -r ./finetune/requirements.txt --index-url https://pypi.mirrors.ustc.edu.cn/simple

三.训练教程

3.1下载配置及数据文件

本教程提供两种配置文件下载方法:

3.11 连接HuggingFace

通过 Python 脚本,直接连接 https://huggingface.co 下载相应配置文件并储存到本地以供使用。此方法需具备科学上网能力。

python Download.py

运行脚本会将分词器及预训练模型权重数据放入 ./Model 文件夹,将微调数据文件处理为 .json 放入格式 ./Datasets ,其中 ./Model ./Datasets 路径可根据需求修改。

#os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'  # 使用镜像站点
# 设置数据集的缓存目录
dataset_cache_dir = "./Datasets/"
# 指定本地保存路径
local_save_path = "./Datasets/evol_instruct_data.json"
# 设置模型缓存目录
local_model_dir = './Model/'

通过此方法加载配置文件需确认文件结构决定是否调整代码 Train.py,下载完成后的文件结构如下:

./Model/models--deepseek-ai--deepseek-coder-6.7b-instruct/
    ├── blobs/  
    ├── refs/             
    └── snapshots 
            └──e5d64addd26a6a1db0f9b863abf6ee3141936807
                                                      └──'tokenizer配置文件'/'PyTorch模型权重文件'

3.12 HuggingFace镜像站

首先设置 HF_ENDPOINT 环境变量, HF_ENDPOINT 变量是 HF 相关库官方支持的一个环境变量,设置后,相关库会尊重该变量指定的主机名,替换 huggingface.co 域名进行模型、数据集的下载和上传,从而做到无需修改 pythontransformers 代码,即可利用镜像站来加载模型。

Bash 窗口:

export HF_ENDPOINT="https://hf-mirror.com"

写入到~/.bashrc中:

echo 'export HF_ENDPOINT="https://hf-mirror.com"' >> ~/.bashrc

修改 Download.py 文件:

# 设置镜像站点 URL
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'  # 使用镜像站点
# 设置数据集的缓存目录
dataset_cache_dir = "./Datasets/"
# 指定本地保存路径
local_save_path = "./Datasets/evol_instruct_data.json"
# 设置模型缓存目录
local_model_dir = './Model/'

然后下载:

python Download.py

同样的,需要注意一下相关路径,因为后续开始训练需要正确使用路径。

配置文件下载成功则会有以下输出:

Dataset saved to ./Datasets/evol_instruct_data.json.
Model downloaded and cached in ...
Dataset downloaded and cached in ...

表示下载完成!

3.2 模型训练

3.21 配置文件及分词器测试

查看脚本 Test.py

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 下载并保存 tokenizer 到本地目录
model_name = "deepseek-ai/deepseek-coder-6.7b-instruct"
local_model_dir = './Model/models--deepseek-ai--deepseek-coder-6.7b-instruct/snapshots/e5d64addd26a6a1db0f9b863abf6ee3141936807'

# 加载本地保存的 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(local_model_dir)
model = AutoModelForCausalLM.from_pretrained(local_model_dir, torch_dtype=torch.bfloat16).cuda()
messages=[
    { 'role': 'user', 'content': "write a quick sort algorithm in python."}
]
inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
# tokenizer.eos_token_id is the id of <|EOT|> token
outputs = model.generate(inputs, max_new_tokens=512, do_sample=False, top_k=50, top_p=0.95, num_return_sequences=1, eos_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True))

确保这一部分使用正确,

local_model_dir = './Model/models--deepseek-ai--deepseek-coder-6.7b-instruct/snapshots/e5d64addd26a6a1db0f9b863abf6ee3141936807'

即与 3.11 部分展示的本地 tokenizer 配置文件及 PyTorch 模型权重文件所在地址一致!

可以根据读者实际情况利用 vim 工具编辑脚本修改。

注: vim 工具是 Linux 中非常简单方便地编辑工具,推荐了解学习哦。

运行脚本:

python Test.py

得到输出类似于:

Sure, here is a simple implementation of the Quick Sort algorithm in Python:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        less_than_pivot = [x for x in arr[1:] if x <= pivot]
        greater_than_pivot = [x for x in arr[1:] if x > pivot]
        return quick_sort(less_than_pivot) + [pivot] + quick_sort(greater_than_pivot)

# Test the function
arr = [10, 7, 8, 9, 1, 5]
print("Original array:", arr)
print("Sorted array:", quick_sort(arr))

This code works by selecting a 'pivot' element from the array and partitioning the other elements into two sub-arrays, according to whether they are less than or greater than the pivot. The pivot element is then in its final position. The process is then repeated for the sub-arrays.

那么你的 tokenizer 配置文件及 PyTorch 模型权重文件下载并且使用成功!

3.22 模型训练开始

运行脚本:

python Train.py
**可能的问题:
Error1 : no_sync 与 ZeRO Stage 3 冲突
AssertionError: no_sync context manager is incompatible with gradient partitioning logic of ZeRO stage 3

这个错误是由于在 ZeRO Stage 3DeepSpeed 的梯度优化阶段 3)中,使用了 no_sync 上下文管理器,而 no_syncZeRO Stage 3 的梯度分区逻辑不兼容。具体来说, ZeRO Stage 3 在进行梯度优化时,默认会对梯度进行分区,这与 no_sync 的逻辑冲突。

则确保 deepspeed 模块版本为 0.15.4 ,如否:

pip install deepspeed==0.15.4
Error2 : “object has no attribute train”
deepspeedzerooptimizer_stage3' object has no attribute train

这可能是由于版本不兼容导致的问题。

可以尝试将 transformers 模块版本降级到 4.44.2

pip install transformers==4.44.2
Error3:AttributeError: 'DeepSpeedCPUAdam' object has no attribute 'ds_opt_adam'

解决方案首先尝试同 Error2

其次考虑 GCC 版本过低,本项目要求 GCC 版本大于 9 ,在 Conda 环境中安装更高版本。此方法避免修改系统的 GCC 设置,允许你继续在受限环境(权限不足)下使用 DeepSpeed

conda install gcc_linux-64=9

解决问题后运行应该就成功了!

**参数解释:

对于脚本 Train.py 中的参数解释如下:

--model_name_or_path MODEL_PATH   # 设置预训练模型的路径或名称
--data_path DATA_PATH             # 设置训练数据的路径
--output_dir OUTPUT_PATH          # 设置训练结果的输出目录
--num_train_epochs EPOCHS         # 设置训练的总周期数(例如 3)
--model_max_length LENGTH         # 设置模型的最大输入长度(例如 1024)
--per_device_train_batch_size B  # 设置每个设备的训练批次大小(例如 16)
--per_device_eval_batch_size B   # 设置每个设备的评估批次大小(例如 1)
--gradient_accumulation_steps S  # 设置梯度累积步数(例如 4)
--evaluation_strategy STRATEGY    # 设置评估策略(例如 'no',表示不进行评估)
--save_strategy STRATEGY         # 设置保存模型的策略(例如 'steps',按步数保存)
--save_steps STEPS               # 设置每多少步保存一次模型(例如 100)
--save_total_limit LIMIT         # 设置最多保存多少个检查点(例如 100)
--learning_rate LR               # 设置学习率(例如 2e-5)
--warmup_steps STEPS             # 设置预热步数(例如 10)
--logging_steps STEPS            # 设置每多少步记录一次日志(例如 1)
--lr_scheduler_type TYPE         # 设置学习率调度器类型(例如 'cosine',使用余弦退火调度)
--gradient_checkpointing FLAG    # 启用或禁用梯度检查点(例如 'True')
--report_to TOOL                 # 设置报告工具(例如 'tensorboard')
--deepspeed DEEPSPEED_CONFIG     # 设置 Deepspeed 配置文件路径
--bf16 FLAG                      # 启用或禁用 bfloat16 精度(例如 'True')
本文系作者 @ admin 原创发布在 文档中心 | AheadAI ,未经许可,禁止转载。