DeepSeek R1微调训练

张开发
2026/4/21 8:08:15 15 分钟阅读

分享文章

DeepSeek R1微调训练
目录环境信息一、准备训练数据二、安装环境1、用conda创建python虚拟环境非必要2、安装jupyter非必要3、安装训练环境三、开始训练1、加载模型2、 加载训练数据集3、 构建训练参数并开始训练4、 训练完成后测试效果5、 保存训练后的模型四、在Ollama中运行模型环境信息操作系统Ubuntu 24.04.1 LTS模型DeepSeek-R1-Distill-Llama-8B训练框架unsloth、pytorch显卡4090一、准备训练数据将自己的数据处理成prompt输入、completion输出两个字段每条数据一行保存成jsonl格式如training_data.jsonl。数据格式示例{prompt: 医药和消费有什么基金推荐的,completion: 医药可以看看工银前沿的xx她挺均衡的对于这个行业我了解不多你还可以看看xx指数} {prompt: 请简述一下人工智能在医疗诊断中的应用及其优势。,completion: 人工智能在医疗诊断中发挥着越来越重要的作用。通过深度学习和机器学习等技术人工智能能够辅助医生进行疾病诊断提高诊断的准确性和效率。} ...二、安装环境1、用conda创建python虚拟环境非必要① conda安装官网地址https://www.anaconda.com/download/success② 执行命令conda create unsloth python3.11③ 切换环境conda activate unsloth2、安装jupyter非必要在命令行中执行①pip install jupyterlab②jupyter lab执行后会自动弹出浏览器或手动打开浏览器访问http://localhost:8888。显示页面如下点击Python 3 创建一个Notebook后续的代码都可以在此执行。3、安装训练环境① 查看cuda版本命令行输入nvidia-smi如果提示命令不存在说明没装驱动先装驱动去。② 安装pytorch!pipinstalltorch2.5.0torchvision0.20.0torchaudio2.5.0 --index-url https://download.pytorch.org/whl/cu124根据自己的显卡驱动选择对应cuda版本的torch包将上面命令中的index-url地址换成适配自己的CUDA版本比如换成11.8版CUDA换成index-url https://download.pytorch.org/whl/cu118③ 安装unsloth!pipinstallunsloth[cu124-torch250] githttps://github.com/unslothai/unsloth.git三、开始训练1、加载模型提前下载好模型model_name改成模型目录。可以到魔塔社区搜索模型名称根据指示下载模型到本地。https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Distill-Llama-8B/files如果目录文件不存在框架会尝试从huggingface下载模型没有梯子下载不了。fromunslothimportFastLanguageModel max_seq_length2048dtypeNoneload_in_4bitTruemodel,tokenizerFastLanguageModel.from_pretrained(model_name../DeepSeek-R1-Distill-Llama-8B,max_seq_lengthmax_seq_length,dtypedtype,load_in_4bitload_in_4bit,)2、 加载训练数据集其中train_prompt_style根据你的场景进行自定义本示例中用于工单生成将data_filestraining_data.jsonl改成自己的数据集路径.train_prompt_style以下是一条描述任务的指令附带用于生成工单的输入参数。 撰写响应时请严格遵守业务规范和安全协议。 在生成之前请分析输入参数并构建一个结构化的推理过程。 ### Instruction: 您是一位拥有10年以上xx行业工单管理经验的高级维护计划员。 请根据以下参数和行业标准生成工作步骤。 ### Question: {} ### Response: {}EOS_TOKENtokenizer.eos_tokendefformatting_prompts_func(examples):inputsexamples[prompt]outputsexamples[completion]texts[]forinput,outputinzip(inputs,outputs):texttrain_prompt_style.format(input,output)EOS_TOKEN texts.append(text)return{text:texts,}fromdatasetsimportload_dataset datasetload_dataset(json,data_filestraining_data.jsonl)datasetdataset[train].map(formatting_prompts_func,batchedTrue,)dataset[text][0]3、 构建训练参数并开始训练modelFastLanguageModel.get_peft_model(model,r16,target_modules[q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj,],lora_alpha16,lora_dropout0,biasnone,use_gradient_checkpointingunsloth,# True or unsloth for very long contextrandom_state3407,use_rsloraFalse,loftq_configNone,)fromtrlimportSFTTrainerfromtransformersimportTrainingArgumentsfromunslothimportis_bfloat16_supported trainerSFTTrainer(modelmodel,tokenizertokenizer,train_datasetdataset,dataset_text_fieldtext,max_seq_lengthmax_seq_length,dataset_num_proc2,argsTrainingArguments(per_device_train_batch_size2,gradient_accumulation_steps4,# Use num_train_epochs 1warmup_steps300,# max_steps60,learning_rate2e-4,fp16notis_bfloat16_supported(),bf16is_bfloat16_supported(),logging_steps10,optimadamw_8bit,weight_decay0.01,lr_scheduler_typelinear,seed3407,output_diroutputs,num_train_epochs1,),)trainer_statstrainer.train()4、 训练完成后测试效果question此处改成你的提问FastLanguageModel.for_inference(model)inputstokenizer([prompt_style.format(question,)],return_tensorspt).to(cuda)outputsmodel.generate(input_idsinputs.input_ids,attention_maskinputs.attention_mask,max_new_tokens1200,use_cacheTrue,)responsetokenizer.batch_decode(outputs)print(response[0].split(### Response:)[1])5、 保存训练后的模型new_model_localDeepSeek-R1-xxxmodel.save_pretrained_merged(new_model_local,tokenizer,save_methodmerged_16bit,)四、在Ollama中运行模型① 首先安装Ollamahttps://ollama.com/步骤略。② 接着上面的代码如果要用Ollama运行模型需将模型合并成gguf格式model.save_pretrained_gguf(DeepSeek-R1-xxx,tokenizer,quantization_methodf16)此时会自动下载llama.cpp目录如果执行报错就打开终端手动执行命令看看什么问题没问题后再运行上面的代码转成gguf。cmake llama.cpp-B llama.cpp/build-DBUILD_SHARED_LIBSOFF-DGGML_CUDAOFF-DLLAMA_CURLON转换成功后可以在DeepSeek-R1-xxx目录下看到一个unsloth.F16.gguf文件。③ 在unsloth.F16.gguf同目录下创建ollama.modelfile文件内容如下FROMunsloth.F16.gguf TEMPLATE{{- if .System }}{{ .System }}{{ end }} {{- range$i,$_: .Messages }} {{-$last: eq (len (slice $.Messages$i)) 1}} {{- if eq .Role user }}User{{ .Content }} {{- else if eq .Role assistant }}Assistant{{ .Content }}{{- if not$last}}end▁of▁sentence{{- end }} {{- end }} {{- if and$last(ne .Role assistant) }}Assistant{{- end }} {{- end }}PARAMETER stop begin▁of▁sentence PARAMETER stop end▁of▁sentence PARAMETER stop User PARAMETER stop Assistant④ 打开命令行用ollama创建模型ollama create r1:xxx-f ollama.modelfile成功后通过ollama ls命令可以看到r1:xxx这个模型。执行ollama run r1:xxx可以进行对话。

更多文章