2026/1/16 1:26:47
网站建设
项目流程
营销网站制作免费咨询,wordpress放广告,网站建设的主要情况说明书,租房合同模板免费下载【保姆级教程】RTX 3090单卡微调 Llama-3 / Qwen2.5#xff1a;基于 Unsloth ModelScope 的极速实战 摘要#xff1a;手握 RTX 3090 这种“深度学习民用神卡”#xff0c;却苦于 Hugging Face 下载太慢#xff1f;微调大模型动辄 OOM#xff08;显存溢出#xff09;基于 Unsloth ModelScope 的极速实战摘要手握 RTX 3090 这种“深度学习民用神卡”却苦于 Hugging Face 下载太慢微调大模型动辄 OOM显存溢出本文将带你体验一套完全适配国内网络环境的本地微调流水线Unsloth (训练加速)ModelScope (极速下载)。实测 Llama-3-8B 下载仅需 5 分钟微调仅需 20 秒关键词LLM微调UnslothModelScopeRTX 3090Llama-30. 前言为什么选择这套方案在个人 PC 上部署和微调大模型我们通常面临三大拦路虎显存焦虑全量微调 8B 模型至少需要 60GB 显存3090 的 24GB 根本不够看。网络龟速Hugging Face (HF) 在国内连接不稳定大文件下载经常断连。训练缓慢原生 HF Trainer 效率一般且依赖繁多。今天的解决方案显存救星使用Unsloth框架配合 4bit 量化加载 (QLoRA)将 8B 模型的显存占用压缩到6GB左右3090 甚至能同时跑两个网络救星放弃 HF 直连改用ModelScope (魔搭社区)国内千兆带宽跑满且完全兼容 HF 格式。效率提升Unsloth 对 LoRA 的反向传播做了极致优化训练速度提升 2-5 倍。1. 环境准备1.1 硬件配置GPU: NVIDIA GeForce RTX 3090 (24GB)CPU: Intel i9-12900KOS: Ubuntu 22.04 / WSL2CUDA: 12.1 (推荐版本)1.2 Python 环境搭建 (Conda)为了避免污染系统环境强烈建议使用 Conda。# 1. 创建环境 (推荐 Python 3.10)conda create -n llm_learnpython3.10-y conda activate llm_learn# 2. 安装 PyTorch (配合 CUDA 12.1)# 推荐使用清华源速度起飞pipinstalltorch torchvision torchaudio --index-url https://pypi.tuna.tsinghua.edu.cn/simple# 3. 安装 Unsloth 和 ModelScope# Unsloth 安装稍微有点讲究按以下顺序pipinstallunsloth[cu124-torch250] githttps://github.com/unslothai/unsloth.gitpipinstallmodelscope2. 解决下载难题ModelScope 登场这是本文的核心 Trick。很多教程直接用 Unsloth 的自动下载结果因为网络原因卡在99%或者报错Read timed out。我们要手动控制下载并过滤掉不需要的文件。避坑指南只下载 SafeTensorsHugging Face 上的模型仓库通常同时包含 PyTorch 原始权重 (.pth) 和 SafeTensors 权重 (.safetensors)。Llama-3-8B 的.pth文件足足有 15GB对 Unsloth 来说完全多余我们在代码中加入ignore_file_pattern直接省下 15GB 流量和硬盘空间。3. 实战代码微调 Llama-3-8B新建文件train_llama3.py直接上完整代码fromunslothimportFastLanguageModelimporttorchfromdatasetsimportload_datasetfromtrlimportSFTTrainerfromtransformersimportTrainingArgumentsfrommodelscopeimportsnapshot_download# --- 引入魔搭下载工具# # 1. 极速下载模型# print( 正在从魔搭社区下载 Llama-3-8B-Instruct (仅 SafeTensors)...)# 关键点ignore_file_pattern[original/*] 避开 15GB 的冗余文件model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B-Instruct,revisionmaster,ignore_file_pattern[original/*])print(f✅ 模型已下载到:{model_dir})# # 2. 加载模型 (4bit 量化)# max_seq_length2048dtypeNone# 自动检测 (3090 支持 Bfloat16)load_in_4bitTrue# 开启 4bit 量化显存占用仅需 ~5.5GBprint(f 正在加载本地 Llama-3 模型...)model,tokenizerFastLanguageModel.from_pretrained(model_namemodel_dir,# 直接加载本地路径max_seq_lengthmax_seq_length,dtypedtype,load_in_4bitload_in_4bit,)# # 3. 配置 LoRA# modelFastLanguageModel.get_peft_model(model,r16,# LoRA 秩target_modules[q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj,],lora_alpha16,lora_dropout0,biasnone,use_gradient_checkpointingunsloth,random_state3407,)# # 4. 准备训练数据# # 构造一个简单的自我认知数据集强迫 Llama-3 说中文# 请在同目录下创建 dummy_data.jsondatasetload_dataset(json,data_filesdummy_data.json,splittrain)defformatting_prompts_func(examples):instructionsexamples[instruction]inputsexamples[input]outputsexamples[output]texts[]forinstruction,input,outputinzip(instructions,inputs,outputs):# Llama-3 标准 Prompt 模板textf|begin_of_text||start_header_id|user|end_header_id|{instruction}{input}|eot_id||start_header_id|assistant|end_header_id|{output}|eot_id|texts.append(text)return{text:texts}datasetdataset.map(formatting_prompts_func,batchedTrue,)# # 5. 开始训练# trainerSFTTrainer(modelmodel,tokenizertokenizer,train_datasetdataset,dataset_text_fieldtext,max_seq_lengthmax_seq_length,dataset_num_proc2,packingFalse,argsTrainingArguments(per_device_train_batch_size2,gradient_accumulation_steps4,warmup_steps5,max_steps20,# 演示用跑 20 步即可learning_rate2e-4,fp16nottorch.cuda.is_bf16_supported(),bf16torch.cuda.is_bf16_supported(),logging_steps1,optimadamw_8bit,weight_decay0.01,lr_scheduler_typelinear,seed3407,output_diroutputs_llama,report_tonone,),)trainer.train()# 保存 LoRA 权重model.save_pretrained(lora_model_llama3)tokenizer.save_pretrained(lora_model_llama3)print( 训练完成)训练数据dummy_data.json示例[{instruction:Who are you?,input:,output:我是由开发者在 RTX 3090 上微调的 Llama-3 中文助手。}]4. 运行效果运行命令python train_llama3.py4.1 下载速度实测截图下载速度跑满 30MB/s5 分钟下完 15GB 模型4.2 训练速度Unsloth 的效率非常惊人。在 3090 上20 步训练仅耗时15.8 秒{loss: 0.3466, grad_norm: 0.843, epoch: 20.0} train_runtime: 15.85095. 推理验证模型练好了它真的记住我们教的话了吗写个推理脚本验证一下。注意Llama-3 需要特殊的停止符 (|eot_id|)否则它可能会一直喋喋不休。fromunslothimportFastLanguageModelimporttorch# 加载微调后的 LoRA 权重model,tokenizerFastLanguageModel.from_pretrained(model_namelora_model_llama3,max_seq_length2048,dtypeNone,load_in_4bitTrue,)FastLanguageModel.for_inference(model)prompt|begin_of_text||start_header_id|user|end_header_id| Who are you?|eot_id||start_header_id|assistant|end_header_id| inputstokenizer([prompt],return_tensorspt).to(cuda)outputsmodel.generate(**inputs,max_new_tokens128,use_cacheTrue,temperature0.1,eos_token_id[tokenizer.eos_token_id,tokenizer.convert_tokens_to_ids(|eot_id|)])responsetokenizer.batch_decode(outputs)[0]answerresponse.split(assistant)[-1].strip()# 清理可能残留的标记answeranswer.replace(|eot_id|,).replace(|end_of_text|,)print(answer)输出结果我是由开发者在 RTX 3090 上微调的 Llama-3 中文助手。完美它不仅理解了问题还完全按照我们的训练数据进行了中文回答。6. 总结通过这套方案我们完美规避了国内开发 LLM 的最大痛点Unsloth解决了显存不足和训练慢的问题3090 显存占用 6GB。ModelScope解决了下载慢、断连的问题无需魔法极速下载。代码控制下载避免了下载冗余的.pth文件节省磁盘空间。接下来的文章中我将介绍如何将这个微调好的模型导出为GGUF格式并导入Ollama让它在你的手机或笔记本上离线运行。欢迎在评论区交流你的 3090 炼丹心得作者Soar | 日期2025年12月23日 | 环境Ubuntu RTX 3090