)
DeepSeek-V4-Flash LoRA 微调与 SwanLab 可视化全流程实战self-llm 嬛嬛对话数据集【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本文基于 self-llm 仓库中 01-DeepSeek-V4-Flash-LoRA及SwanLab可视化记录.md 一文完整复现并深入讲解如何使用 transformers、peft 等框架对 DeepSeek-V4-Flash 的 BF16 权重进行 LoRA 微调构建能够模拟甄嬛对话风格的个性化大模型。读者学完后将掌握DeepSeek-V4-Flash 两种权重形态BF16 与 FP4FP8的选择逻辑、该模型独特投影层结构下的 LoRA target_modules 配置技巧、基于SwanLabCallback的训练可视化方法以及训练后 LoRA 权重挂载到官方 FP4 FP8 基础模型上的推理方案。文中所有配置均可直接复制运行训练代码与推理代码位于 01-DeepSeek-V4-Flash-LoRA.py 与 01-DeepSeek-V4-Flash-LoRA-Inference.py。一、任务背景用嬛嬛数据集打造个性化对话模型大模型微调通常指指令微调Instruction Tuning。微调数据的形态如下{ instruction: 回答以下用户问题仅输出答案。, input: 11等于几?, output: 2 }其中instruction是用户指令告知模型需要完成的任务input是用户输入是完成指令所必需的输入内容output是模型应该给出的输出。核心训练目标是让模型具备理解并遵循用户指令的能力因此在指令集构建时应针对目标任务针对性构建任务指令集。本文以开源 Chat-甄嬛项目为示例目标是构建能够模拟甄嬛对话风格的个性化 LLM指令格式如下{ instruction: 你是谁, input: , output: 家父是大理寺少卿甄远道。 }使用的示例数据集位于 dataset/huanhuan.jsonl共 3729 条instruction/input/output数据。数据集内容全部为甄嬛传风格的宫廷对话例如{instruction:娘娘。,input:,output:你放心本宫到任何时候都不会自轻自贱委屈了这孩子。} {instruction:皇上驾到,input:,output:皇上万福金安。}实验硬件为 8 张 NVIDIA RTX PRO 6000 Blackwell Server Edition 96GB 显卡属于较大规模的多卡训练场景。二、环境配置实验所依赖的基础开发环境如下---------------- ubuntu 22.04 Python 3.12 cuda 13.0 pytorch 2.11.0 ----------------默认已安装上述 PyTorch 和 CUDA 环境。首先pip换源加速下载并安装依赖包# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers5.12.1 # Hugging Face 的模型库用于加载和训练模型 pip install accelerate1.14.0 # 用于分布式训练和混合精度训练 pip install datasets5.0.0 # 用于加载和处理数据集 pip install peft0.19.1 # 用于 LoRA 微调 pip install swanlab0.8.4 # 用于记录和可视化训练指标 pip install huggingface_hub # 用于从 Hugging Face 下载模型 pip install kernels0.14.1 # 用于加载 FP4 FP8 推理算子各依赖的角色分工如下transformersHugging Face 模型库负责模型与 tokenizer 的加载及Trainer训练循环accelerate底层支撑device_mapauto的多卡自动分配与混合精度训练datasets加载jsonl数据集并完成批量预处理peft提供LoraConfig、get_peft_model、load_adapter等 LoRA 微调与挂载能力swanlab训练指标记录与可视化kernels加载 FP4 FP8 推理算子用于推理阶段的低精度权重运算。三、模型下载BF16 权重用于训练FP4 FP8 权重用于推理DeepSeek 官方发布的deepseek-ai/DeepSeek-V4-Flash为 FP4 FP8 混合精度权重适合推理部署但不能直接用于本教程的 LoRA 训练。本文训练使用社区发布的RedHatAI/DeepSeek-V4-Flash-BF16权重推理时加载 DeepSeek 官方 FP4 FP8 权重。这一点是本节最关键的选型决策训练需要高精度的 BF16 全精度权重以稳定计算梯度而官方低精度权重仅适用于前向推理。使用huggingface_hub中的snapshot_download函数下载模型。第一个参数repo_id为模型名称第二个参数local_dir为模型的下载路径。在/root/autodl-tmp路径下新建model_download.py文件并粘贴以下代码from huggingface_hub import snapshot_download model_dir snapshot_download( repo_idRedHatAI/DeepSeek-V4-Flash-BF16, local_dir/root/autodl-tmp/RedHatAI/DeepSeek-V4-Flash-BF16, ) print(f模型下载完成保存路径为{model_dir})注意将local_dir修改为实际的模型下载路径。在终端运行python /root/autodl-tmp/model_download.py执行下载模型体积较大下载时间较久。推理部分使用官方 FP4 FP8 权重可将下载代码中的repo_id和local_dir分别修改为repo_iddeepseek-ai/DeepSeek-V4-Flash local_dir/root/autodl-tmp/deepseek-ai/DeepSeek-V4-Flash磁盘空间规划需要特别注意BF16 权重约为 532GB官方 FP4 FP8 权重约为 149GB。如果同时保存两份权重建议预留不少于 700GB 的磁盘空间。AutoDL 实例的数据盘空间不足时可以将权重放到文件存储路径例如/root/autodl-fs/models/DeepSeek-V4-Flash-BF16。四、数据格式化按官方 chat 模式编码并构造 labelsLoRA 训练前需要对文本进行格式化和编码。input_ids保存完整对话的 token IDlabels中的用户输入部分设为-100训练时只计算助手回答部分的损失。DeepSeek-V4-Flash 没有提供 Jinja 格式的chat_template。本文按照模型仓库encoding目录中的官方 chat 模式定义对话格式def encode_chat_text(system_prompt, user_content, assistant_contentNone): text ( begin▁of▁sentence f{system_prompt} User f{user_content} Assistant/think ) if assistant_content is not None: text f{assistant_content}end▁of▁sentence return text这段对话格式与常见模型的bosuser...assistant...模板不同采用了begin▁of▁sentence/User/Assistant/think/end▁of▁sentence的专属标记结构其中Assistant/think用于触发模型的思考-回答流程。然后定义预处理函数process_func对每一个样本编码其输入、输出文本并返回一个编码后的字典方便模型使用def process_func(example): MAX_LENGTH 2048 # 设置最大序列长度为 2048 个 token system_prompt 现在你要扮演皇帝身边的女人--甄嬛。 instruction str(example.get(instruction) or ) user_input str(example.get(input) or ) output str(example.get(output) or ) user_content instruction user_input prompt_text encode_chat_text(system_prompt, user_content) full_text encode_chat_text(system_prompt, user_content, output) prompt_ids tokenizer(prompt_text, add_special_tokensFalse)[input_ids] full tokenizer(full_text, add_special_tokensFalse) input_ids full[input_ids] attention_mask full.get(attention_mask, [1] * len(input_ids)) labels [-100] * len(prompt_ids) input_ids[len(prompt_ids):] if tokenizer.eos_token_id is not None and (not input_ids or input_ids[-1] ! tokenizer.eos_token_id): input_ids.append(tokenizer.eos_token_id) attention_mask.append(1) labels.append(tokenizer.eos_token_id) if len(input_ids) MAX_LENGTH: # 超出最大序列长度截断 input_ids input_ids[:MAX_LENGTH] attention_mask attention_mask[:MAX_LENGTH] labels labels[:MAX_LENGTH] return { input_ids: input_ids, attention_mask: attention_mask, labels: labels, }该函数的处理逻辑可拆解为四步拼接将instruction与input拼接为user_contentoutput为期望回答双份编码分别编码「提示词」system user不含回答与「完整对话」含回答通过两次编码的长度差切分labels掩码提示词部分的labels全部置为-100使损失只由助手回答以及追加的 eos token贡献截断超出MAX_LENGTH 2048的序列被截断保证 batch 内序列长度可控。加载数据集from datasets import load_dataset data_path ../../dataset/huanhuan.jsonl dataset load_dataset(json, data_filesdata_path, splittrain)在仓库根目录下该数据集的真实相对路径为 dataset/huanhuan.jsonl。五、加载模型与 tokenizer下面加载 tokenizer 和 DeepSeek-V4-Flash 的 BF16 权重。通过dtypetorch.bfloat16指定模型精度并使用device_mapauto将模型自动分配到可见的 GPUimport torch from transformers import AutoModelForCausalLM, AutoTokenizer model_path /root/autodl-tmp/RedHatAI/DeepSeek-V4-Flash-BF16 tokenizer AutoTokenizer.from_pretrained( model_path, use_fastTrue, trust_remote_codeTrue, ) if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token if tokenizer.pad_token_id is None and tokenizer.eos_token_id is not None: tokenizer.pad_token_id tokenizer.eos_token_id tokenizer.padding_side right tokenized_id dataset.map(process_func, remove_columnsdataset.column_names) model AutoModelForCausalLM.from_pretrained( model_path, dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue, low_cpu_mem_usageTrue, )此处有几点关键注意事项model_path必须填写BF16 权重路径不要使用官方 FP4 FP8 权重路径进行训练DeepSeek-V4-Flash 模型较大建议使用device_mapauto加载避免在每张显卡上完整复制一份模型low_cpu_mem_usageTrue降低 CPU 侧内存峰值tokenizer 的 pad 配置当模型没有显式定义 pad token 时用 eos token 兜底并将padding_side设为right与训练数据拼接方向保持一致。如果想要查看模型结构可以打印模型print(model)在 DeepSeek-V4-Flash 的 attention 模块中可以看到与常见 LLaMA/Qwen 模型不同的投影层名称例如q_a_proj、q_b_proj、kv_proj、o_a_proj、o_b_proj。因此本文不会使用q_proj、k_proj、v_proj、o_proj作为 LoRA target这是该模型与主流开源模型微调教程最大的差异点。六、定义 LoRA 配置避开 grouped linear 陷阱LoraConfig用于设置 LoRA 微调参数本文使用的主要参数如下task_type微调任务类型因果语言模型使用CAUSAL_LMtarget_modules注入 LoRA 的模型层名称rLoRA 的秩lora_alphaLoRA 的缩放参数lora_dropoutLoRA 层的 Dropout 比例。本文配置的 LoRA 缩放系数为lora_alpha / r 2from peft import LoraConfig, TaskType, get_peft_model config LoraConfig( task_typeTaskType.CAUSAL_LM, target_modules[q_a_proj, q_b_proj, kv_proj, o_b_proj], inference_modeFalse, # 训练模式 r16, # LoRA 秩 lora_alpha32, # LoRA 缩放参数 lora_dropout0.05 # Dropout 比例 ) model get_peft_model(model, config) model.print_trainable_parameters()为什么没有注入o_a_projo_a_proj在 DeepSeek-V4-Flash 中是 grouped linear 结构PEFT 会将其按普通 Linear 处理训练时可能触发 grouped shape mismatch。因此本文只选择q_a_proj、q_b_proj、kv_proj、o_b_proj四个投影层。这一取舍在训练脚本源码中也有明确注释佐证见 01-DeepSeek-V4-Flash-LoRA.py# o_a_proj is a grouped linear layer. Injecting it as a regular Linear layer # can cause a grouped-shape mismatch during the forward pass. DEFAULT_LORA_TARGETS q_a_proj,q_b_proj,kv_proj,o_b_proj本教程配置下可训练参数量约为 46,149,632约 4600 万相对模型总参数量而言占比极小这正是 LoRA 高效微调的体现。训练脚本还支持通过--lora-targets以逗号分隔字符串自定义注入层并经由parse_targets拆分为列表01-DeepSeek-V4-Flash-LoRA.py。七、自定义 TrainingArguments 训练参数TrainingArguments用于配置训练过程本文使用的主要参数如下output_dir模型的输出路径per_device_train_batch_size单次迭代的样本数gradient_accumulation_steps梯度累积步数logging_steps训练日志记录间隔max_steps最大训练步数gradient_checkpointing使用计算时间换取更低的显存占用。from transformers import TrainingArguments args TrainingArguments( output_dir./output/DeepSeek-V4-Flash-LoRA, per_device_train_batch_size1, gradient_accumulation_steps16, logging_steps1, max_steps200, save_steps100, save_total_limit2, learning_rate5e-5, save_on_each_nodeTrue, bf16True, fp16False, gradient_checkpointingTrue, gradient_checkpointing_kwargs{use_reentrant: False}, remove_unused_columnsFalse, report_to[], )参数组合要点解析per_device_train_batch_size1配合gradient_accumulation_steps16等效 batch size 为 16既保证 DeepSeek-V4-Flash 这种大模型放得进显存又维持足够的有效批次统计量bf16True, fp16False使用 BF16 混合精度训练与模型 BF16 权重精度对齐gradient_checkpointingTrue用重计算换显存use_reentrantFalse是 transformers 新版本推荐的实现方式save_total_limit2只保留最近 2 个 checkpoint避免 500GB 级大模型的磁盘被 checkpoint 塞满report_to[]关闭默认的第三方报告器若启用 SwanLab由SwanLabCallback独立接管指标上报详见下一节remove_unused_columnsFalse保留原始列避免 data collator 因列名不匹配报错。开启梯度检查点model.config.use_cache False if hasattr(model, enable_input_require_grads): model.enable_input_require_grads() if hasattr(model, gradient_checkpointing_enable): model.gradient_checkpointing_enable(gradient_checkpointing_kwargs{use_reentrant: False})训练时use_cacheFalse关闭 KV Cache梯度检查点与 KV Cache 不兼容并通过enable_input_require_grads()保证输入嵌入层有梯度否则在梯度检查点场景下可能出现输入不可导的错误。八、SwanLab 可视化从实验记录到训练指标看板SwanLab 简介SwanLab 是一个开源的模型训练记录工具面向 AI 研究者提供了训练可视化、自动日志记录、超参数记录、实验对比、多人协同等功能。在 SwanLab 上研究者能基于直观的可视化图表发现训练问题对比多个实验找到研究灵感并通过在线链接的分享与基于组织的多人协同训练打破团队沟通的壁垒。为什么要记录训练相较于软件开发模型训练更像一个实验科学。一个品质优秀的模型背后往往是成千上万次实验。研究者需要不断尝试、记录、对比积累经验才能找到最佳的模型结构、超参数与数据配比。在这之中如何高效进行记录与对比对于研究效率的提升至关重要。实例化 SwanLabCallback建议先在 SwanLab 官网注册账号然后在训练初始化阶段选择(2) Use an existing SwanLab account并使用 private API Key 登录。SwanLab 与 Transformers 已经做好了集成用法是在 Trainer 的 callbacks 参数中添加 SwanLabCallback 实例即可自动记录超参数和训练指标简化代码如下from swanlab.integration.transformers import SwanLabCallback swanlab_callback SwanLabCallback( projectdeepseek-v4-flash, experiment_namehuanhuan-r16-a32-200step, )训练脚本中的 SwanLab 开关设计在完整的训练脚本 01-DeepSeek-V4-Flash-LoRA.py 中独立训练脚本默认不启用SwanLab只有传入--swanlab-project时才会创建SwanLabCallback不启用时保持TrainingArguments(report_to[])def build_swanlab_callback(args): if not args.swanlab_project: return None from swanlab.integration.transformers import SwanLabCallback return SwanLabCallback( projectargs.swanlab_project, experiment_nameargs.swanlab_experiment, )这种惰性初始化设计的好处是训练脚本可以无缝在纯本地记录与云端可视化两种模式间切换无需修改任何训练逻辑callbacks列表为空时Trainer保持默认行为。九、使用 Trainer 训练并启动 SwanLab 记录使用Trainer类管理训练过程。TrainingArguments用于设置训练参数Trainer负责实际的训练逻辑from transformers import DataCollatorForSeq2Seq, Trainer trainer Trainer( modelmodel, # 要训练的模型 argsargs, # 训练参数 train_datasettokenized_id, # 训练数据集 data_collatorDataCollatorForSeq2Seq( tokenizertokenizer, paddingTrue, label_pad_token_id-100, ), callbacks[swanlab_callback], ) trainer.train() # 开始训练 trainer.save_model(args.output_dir) tokenizer.save_pretrained(args.output_dir)DataCollatorForSeq2Seq负责将 batch 内不同长度的序列 padding 到统一长度label_pad_token_id-100保证 padding 部分不参与损失计算。完整训练代码见 01-DeepSeek-V4-Flash-LoRA.py。在 8 张显卡的环境中可以使用以下命令启动训练并开启 SwanLab 记录python 01-DeepSeek-V4-Flash-LoRA.py \ --swanlab-project deepseek-v4-flash \ --swanlab-experiment huanhuan-r16-a32-200step训练脚本还通过argparse暴露了丰富的命令行参数并支持环境变量覆盖01-DeepSeek-V4-Flash-LoRA.py常用的包括命令行参数默认值说明--model-path/root/autodl-tmp/RedHatAI/DeepSeek-V4-Flash-BF16BF16 模型路径可用环境变量DS_V4_MODEL_PATH覆盖--data-path仓库内dataset/huanhuan.jsonl训练数据集路径可用DS_V4_DATA_PATH覆盖--output-dir./output/DeepSeek-V4-Flash-LoRA输出目录可用DS_V4_OUTPUT_DIR覆盖--max-length2048最大序列长度--max-steps200最大训练步数--learning-rate5e-5学习率--per-device-train-batch-size1单卡 batch size--gradient-accumulation-steps16梯度累积步数--lora-r/--lora-alpha/--lora-dropout16/32/0.05LoRA 超参数--lora-targetsq_a_proj,q_b_proj,kv_proj,o_b_projLoRA 注入层--system-prompt现在你要扮演皇帝身边的女人--甄嬛。系统提示词--expected-gpus8期望的 GPU 数量不符时打印警告--num-proc无数据集预处理并行进程数--swanlab-project/--swanlab-experiment空 /huanhuan-r16-a32-200stepSwanLab 项目名与实验名其中--data-path的默认值在源码中通过Path(__file__).resolve().parents[2] / dataset / huanhuan.jsonl自动定位01-DeepSeek-V4-Flash-LoRA.py即无论脚本放在哪个子目录都能正确指回仓库根目录下的 dataset/huanhuan.jsonl。脚本启动时还会校验模型与数据路径是否存在不存在直接抛FileNotFoundError并打印可见 GPU 数量便于在多卡环境中提前发现问题。十、训练结果演示训练完成后打开 SwanLab 即可查看训练过程中记录的参数和训练指标包括 loss、grad_norm、learning_rate 和 epoch 的变化如上文配图所示。本次实验完成 200 step训练耗时约 74 分钟最终train_loss为 2.605。从曲线中可以观察到train/loss从约 4.5 快速下降并收敛到 2.53.0 区间震荡符合指令微调的收敛特征train/grad_norm稳定在合理范围内未出现梯度爆炸或消失train/learning_rate从 5e-5 线性衰减至 0train/epoch在 200 step 内从 0 上升至约 0.9。训练完成后的 LoRA 权重会保存在./output/DeepSeek-V4-Flash-LoRA至此DeepSeek-V4-Flash 的 LoRA 微调训练已完成。如果需要进一步改善效果可以增加训练步数或根据任务构建更高质量的数据集。十一、加载 LoRA 权重推理得到 checkpoint 之后加载官方 FP4 FP8 基础模型并挂载 LoRA 权重进行推理。完整推理代码见 01-DeepSeek-V4-Flash-LoRA-Inference.pyfrom transformers import AutoModelForCausalLM, AutoTokenizer import torch from peft.functional import cast_adapter_dtype model_path /root/autodl-tmp/deepseek-ai/DeepSeek-V4-Flash # 官方 FP4 FP8 基础模型路径 lora_path ./output/DeepSeek-V4-Flash-LoRA # 训练得到的 LoRA 权重路径按实际填写 def encode_chat_text(system_prompt, user_content, assistant_contentNone): text ( begin▁of▁sentence f{system_prompt} User f{user_content} Assistant/think ) if assistant_content is not None: text f{assistant_content}end▁of▁sentence return text # 加载 tokenizer tokenizer AutoTokenizer.from_pretrained(lora_path, use_fastTrue, trust_remote_codeTrue) if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token if tokenizer.pad_token_id is None and tokenizer.eos_token_id is not None: tokenizer.pad_token_id tokenizer.eos_token_id # 加载官方 FP4 FP8 基础模型 model AutoModelForCausalLM.from_pretrained( model_path, dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue, low_cpu_mem_usageTrue, ) # 加载 LoRA 权重并将 adapter 权重转换为可计算的浮点精度 model.load_adapter( lora_path, adapter_namedefault, low_cpu_mem_usageTrue, ) cast_adapter_dtype(model, adapter_namedefault) model.set_adapter(default) model.eval() # 使用 DeepSeek-V4 官方 chat 模式构造对话 text encode_chat_text( system_prompt现在你要扮演皇帝身边的女人--甄嬛。, user_content你是谁, ) inputs tokenizer(text, return_tensorspt).to(model.device) with torch.no_grad(): generated_ids model.generate( **inputs, max_new_tokens128, do_sampleFalse, pad_token_idtokenizer.pad_token_id, eos_token_idtokenizer.eos_token_id, ) output_ids generated_ids[0][inputs[input_ids].shape[1]:] generate_text tokenizer.decode(output_ids, skip_special_tokensTrue) generate_text generate_text.split(end▁of▁sentence, 1)[0].strip() print(generate_text)推理链路中值得注意的实现细节tokenizer 从 LoRA 目录加载推理脚本会优先从 adapter 目录读取 tokenizer训练结束时已通过tokenizer.save_pretrained保存仅当 adapter 目录缺少tokenizer_config.json时才回退到基础模型目录01-DeepSeek-V4-Flash-LoRA-Inference.pycast_adapter_dtype将 LoRA adapter 权重转换为可计算的浮点精度确保在 FP4 FP8 基础模型上也能正确进行浮点运算加载完整性校验脚本检查load_adapter返回的 missing / unexpected / mismatched keys任何一项非空即抛RuntimeError防止权重静默加载失败但推理看似正常的隐蔽问题01-DeepSeek-V4-Flash-LoRA-Inference.py输入设备对齐将输入显式移动到模型输入嵌入层所在设备model.get_input_embeddings().weight.device规避device_mapauto下设备不一致的问题输出后处理用split(end▁of▁sentence)截断可能的终止标记skip_special_tokensTrue去除特殊 token。运行推理脚本python 01-DeepSeek-V4-Flash-LoRA-Inference.py \ --model-path /root/autodl-tmp/deepseek-ai/DeepSeek-V4-Flash \ --adapter-path ./output/DeepSeek-V4-Flash-LoRA输出示例我是甄嬛家父是大理寺少卿甄远道。从输出可以看出LoRA 权重已成功加载模型能够按照训练数据中的人物设定回答。推理脚本同样支持--prompt、--system-prompt、--max-new-tokens、--device-map等参数以及DS_V4_MODEL_PATH、DS_V4_ADAPTER_PATH环境变量覆盖方便批量测试不同问题。十二、总结本文完整走通了「BF16 权重 LoRA 微调 → SwanLab 可视化 → LoRA 挂载官方 FP4 FP8 权重推理」的 DeepSeek-V4-Flash 个性化微调闭环核心要点可归纳为权重选型训练必须使用 BF16 全精度权重约 532GB官方 FP4 FP8 权重约 149GB仅用于推理两者需分开下载LoRA target 取舍DeepSeek-V4-Flash 的 attention 投影层名为q_a_proj、q_b_proj、kv_proj、o_b_proj、o_a_proj其中o_a_proj是 grouped linear 结构注入会导致 shape mismatch应避开数据编码模型无 Jinja 版 chat_template需按begin▁of▁sentence / User / Assistant / think / end▁of▁sentence官方格式手工拼接并将用户侧 labels 置-100训练可视化通过SwanLabCallback与Trainer无缝集成一个命令行参数即可开关云端指标记录推理挂载load_adaptercast_adapter_dtype组合可把 LoRA 权重挂到低精度基础模型上并以校验逻辑确保加载完整。若希望进一步改善对话质量可增加max_steps训练步数或根据目标场景构建更高质量、更贴近人物语言的指令数据集。训练与推理的完整可运行代码分别位于 01-DeepSeek-V4-Flash-LoRA.py 与 01-DeepSeek-V4-Flash-LoRA-Inference.py训练数据为 dataset/huanhuan.jsonl可供直接复现。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考