DeepSeek Coder:基于大型代码语言模型的高效代码补全系统
一.概述
本教程旨在帮助用户快速上手使用 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 域名进行模型、数据集的下载和上传,从而做到无需修改 python 的 transformers 代码,即可利用镜像站来加载模型。
在 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 3
(DeepSpeed 的梯度优化阶段 3)中,使用了 no_sync
上下文管理器,而 no_sync
与 ZeRO 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')
评论