ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows 11本地大模型微调与API部署:WSL2+QLoRA全流程实战

Windows 11本地大模型微调与API部署:WSL2+QLoRA全流程实战 先说个背景我之前一直用Linux做模型相关的东西结果换到Windows 11之后最痛苦的就是环境问题跑个推理脚本都要折腾半天驱动和CUDA更别说训练了。折腾了大概一个月把Windows 11上从本地微调模型到把模型封装成API服务这一整条链路都跑通了期间踩的坑实在太多所以把这些整理成一份完整的攻略给正准备在Windows上做本地大模型训练和API服务部署的人指条直线路径。这篇文章适合几类人一是公司机器锁了系统不让装双系统、只能Windows办公的二是想在笔记本上用自己显卡做私有数据微调尝鲜的三是想把训练好的模型部署成本地API给前端或内部工具调用的。我会把方案选型、环境搭建、训练实操、API部署、常见问题全拆开讲清楚保证你照着做就能跑通。1. 先盘清楚在Windows上做本地大模型开发到底该怎么规划1.1 Windows不是大模型的主场但也不是不行先给结论Windows 11上做本地大模型训练和API部署完全可行但最稳的路径不是全在Windows原生环境里搞而是“Windows 11 WSL2 Docker”的组合。原因很简单当前主流的模型训练工具链Hugging Face Transformers、PEFT、trl、vLLM、llama.cpp从设计之初就是Linux优先的很多算子上限、显存优化、编译优化只在Linux侧验证过Windows原生版要么功能残缺要么性能打折。我实测对比过同一个7B模型做QLoRA微调Windows原生Python环境和WSL2里跑训练速度差距不算大但稳定性差距明显。Windows原生环境经常因为显存分配策略、内存映射文件机制不一致导致奇怪的卡死或OOMWSL2里跑反而正常。另外很多第三方库的最新版本比如Unsloth根本不提供Windows原生支持你要是想用就必须进WSL2。所以这整篇攻略的底层逻辑就是训练和部署都尽量跑在WSL2的Linux环境里只把Windows当成宿主系统。Windows负责扛驱动、扛硬盘、扛电源管理WSL2负责扛所有深度学习活。1.2 训练和推理分开看你的目标是微调还是部署很多人一上来就问“我这个配置能不能训练大模型”其实得先把目标拆开。训练和推理是两件完全不同的事对硬件和软件栈的要求也完全不同。训练确切说是微调意味着你要拿着私有数据去改动模型的权重哪怕是LoRA这种参数高效的微调也要占用显存去存储梯度、优化器状态和中间激活值。这玩意儿对显存和内存都非常敏感。部署则是把已经训练好的模型跑起来对外提供服务比如封装成OpenAI风格的API接口。部署阶段模型是推理模式显存占用比训练低得多但你要考虑的是并发能力、请求排队、服务稳定性、端口管理这些东西。我见过太多人把这两个目标混为一谈拿训练的高配置要求去看部署场景结果发现自己的机器完全不够用直接放弃。其实哪怕你只有8GB显存训练一个7B小模型通常都够呛但部署一个7B甚至14B的量化模型却非常轻松。所以先想明白你到底要干什么再决定后面的架构。1.3 给不同配置用户的方案选型建议我按显卡配置给几套我自己实测过或者验证过可行的方案你可以直接对号入座你的配置推荐路线具体玩法期望效果8GB显存 32GB内存中小模型QLoRA微调1.5B~7B模型4bit量化LoRA rank在16~32之间最大序列长度控制在2048以内单卡能跑通速度不算快但可用12GB~16GB显存 64GB内存7B~14B微调主力区Qwen2.5-7B / Qwen2.5-14B4bit QLoRA序列长度可到4096日常微调最舒服的配置段24GB显存 64GB以上内存大模型微调进阶区14B~32B模型的QLoRA甚至可以考虑部分参数全量微调基本可以应对绝大多数开源模型纯CPU 大内存放弃训练只做部署用小模型的GGUF量化版Q4/Q5用llama.cpp或Ollama部署速度慢但能用AMD显卡不建议在Windows上训练Windows下ROCm支持极其有限建议直接用云GPU或换思路别在AMD上浪费时间训练这个表格不是绝对的我见过有人用16GB显存硬跑32B模型的把quantization、gradient checkpointing、序列长度压到极限但那种体验纯粹是折磨自己不值得。2. 环境搭建这一套搞不定后面全是坑2.1 驱动和CUDA最容易翻车的第一步先说一个很多人都会踩的坑Windows下装NVIDIA驱动其实已经包含了CUDA运行库的驱动部分你在Windows侧只需要装一个最新的显卡驱动就好不需要也不建议再去装一个完整的CUDA Toolkit到Windows里因为WSL2会通过显卡驱动直接调用GPU的CUDA计算能力。具体操作到NVIDIA官网下载对应显卡的最新驱动装好然后打开WSL2在里面执行nvidia-smi如果能显示出显卡信息和驱动版本就说明驱动层面已经OK了。在WSL2里你用PyTorch的时候其实不需要单独安装CUDA Toolkit因为PyTorch的pip包已经自带了CUDA运行时。你只需要确认一件事安装PyTorch时选择正确的CUDA版本对应的包。比如# 在WSL2里执行 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124这里有个关键细节如果你需要编译自定义算子比如装一些需要JIT编译的库那时候才需要手动安装与Windows驱动版本匹配的CUDA Toolkit到WSL2里。常规操作基本用不到。AMD显卡用户在Windows下就真的很尴尬ROCm在Windows的支持属于“基本没法用”级别。我不建议在Windows上给AMD显卡折腾训练性价比太低要么换NVIDIA要么干脆上云GPU实例讲。这不是偏见是我真踩过这坑。2.2 WSL2 Docker Desktop给Windows装个“Linux后厨”环境搭建的重头戏是WSL2和Docker。WSL2本质上是Windows内置的轻量虚拟机它和Windows共享内核调度、共享网络、还能直接调用Windows侧的GPU驱动这设计非常聪明。训练环境装在里面性能损耗小到可以忽略。启用步骤我直接给你命令序列# 以管理员身份打开PowerShell wsl --install # 重启电脑后默认会装好Ubuntu wsl --set-default-version 2装好之后我强烈建议你在Windows用户目录下新建一个.wslconfig文件控制WSL2的资源配额和网络模式[wsl2] memory24GB processors12 swap8GB networkingModemirrored这里几个参数说一下“memory”是WSL2能拿到的最大内存不要设满给Windows留至少8GB“processors”同理别全给“networkingModemirrored”这个非常关键它让WSL2和Windows共享网络栈WSL2里的服务可以直接通过Windows的IP访问局域网内其他设备也更容易连进来。没有这个模式的话WSL2是NAT网络外部访问要搞端口转发麻烦且不直观。然后装Docker Desktop安装时选择“Use WSL 2 based engine”它就会把Docker的守护进程跑在WSL2的虚拟化环境里。很多模型推理框架比如vLLM官方推荐的就是Docker方式部署这一步绕不开。再强调一个实操细节WSL2访问Windows文件系统/mnt/c/的性能非常差尤其是大量小文件读写的时候那速度能让你怀疑人生。所以项目代码、训练数据、模型权重这些文件一定要放在WSL2自己的文件系统里比如 ~/projects/不要放在 /mnt/c/ 下。Windows和WSL2之间传文件偶尔来一下可以高频读写绝对不行。2.3 虚拟内存、温度与电源训练是持久战很多人搭好环境训练一开始就出幺蛾子屏幕上跳“CUDA out of memory”或者机器直接蓝屏。除了显存不够之外还有一个经常被忽视的因素电源和散热。Windows笔记本在拔掉电源时显卡性能和功耗墙会被限制得很低。你插着电源训练和拔掉电源训练速度差距可能有一倍多这直接影响显存的利用效率和训练稳定性。所以训练前一定要确保插电、开启高性能电源模式然后将显卡驱动面板的电源管理模式设为“最高性能优先”。NVIDIA控制面板里那个选项平时默认是优化功耗的训练大模型时必须改掉。散热方面长时间训练会让显存和核心温度飙升超过一定温度后频率会跳水速度反而变慢。我的做法是开着MSI Afterburner监控温度和显存占用不要拉超频只监控一旦发现显存温度超过85度或者核心温度超过80度就降低一些功耗墙或者清理机器灰尘。这看起来和“部署服务”没关系但它决定了你的训练能不能顺利跑完。3. 训练实操用Qwen2.5-7B走一遍QLoRA微调全流程3.1 微调之前数据格式和任务边界开始写代码之前先说数据。本地微调大模型最常见的是指令微调Instruction Tuning数据格式一般就是一个JSONL文件每行一个JSON对象包含用户指令和期望输出{instruction: 介绍一下苹果公司的产品线。, output: 苹果公司的主要产品包括iPhone、iPad、Mac、Apple Watch等。} {instruction: 翻译成英文今天天气不错。, output: The weather is nice today.}如果你的数据是对话形式可以用messages格式{messages: [{role: user, content: 你是谁}, {role: assistant, content: 我是基于Qwen2.5微调出的助手。}]}微调数据量多少合适我的经验是质量和多样性远比数量重要。几百条高质量、覆盖目标场景的数据就足够让模型学会你的格式和风格。你要是从网上抓几万条乱七八糟的数据堆进去模型可能学出一堆幻觉反而变笨。任务边界这里我要多说一句你在本地微调7B模型不要指望它突然获得本科学历一般的知识储备。微调的作用主要是调整回答风格、注入你私有格式、强化特定业务场景的处理能力。真要让它提升推理能力那得换更大的模型和更有深度的训练方法本地Windows环境撑不住。3.2 训练脚本留一个能直接改的模板下面这个脚本是整套流程的核心我用的是Hugging Face生态的transformers PEFT trl组合这套组合在WSL2里跑得非常稳也是目前最通用、最多人验证过的方案。比Unsloth更容易排查问题出了问题Google一搜就能找到解决方案。import torch from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments, ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from datasets import load_dataset from trl import SFTTrainer # 1. 4bit量化配置这是QLoRA的核心把基座模型压到4bit bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, # 4bit量化类型nf4比fp4效果更好 bnb_4bit_compute_dtypetorch.bfloat16, # 计算时用bf16 bnb_4bit_use_double_quantTrue, # 双重量化进一步省显存 ) # 2. 加载基座模型和tokenizer model AutoModelForCausalLM.from_pretrained( Qwen/Qwen2.5-7B-Instruct, quantization_configbnb_config, device_mapauto, # 自动分配模型到GPU trust_remote_codeTrue, ) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-7B-Instruct, trust_remote_codeTrue) tokenizer.padding_side right # 3. 为量化训练做准备重要否则显存会爆 model prepare_model_for_kbit_training(model) # 4. LoRA配置只训练小部分参数 lora_config LoraConfig( r16, # LoRA rankrank越高可学习参数越多 lora_alpha32, # 缩放系数一般取2倍r target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], lora_dropout0.05, biasnone, task_typeCAUSAL_LM, ) model get_peft_model(model, lora_config) # 5. 加载数据 dataset load_dataset(json, data_files./data/train.jsonl, splittrain) # 6. 定义把数据拼接成模型输入格式的函数 def format_func(example): text f指令{example[instruction]}\n输出{example[output]}|im_end| return text # 7. 训练参数 training_args TrainingArguments( output_dir./qwen-lora-checkpoints, num_train_epochs3, per_device_train_batch_size1, # 7B模型4bit下batch1已经比较合理 gradient_accumulation_steps8, # 相当于batch8的效果 learning_rate2e-4, logging_steps10, save_steps200, # 定期保存checkpoint save_total_limit2, fp16True, # 如果你的显卡是30系以上也可以用bf16 report_tonone, optimpaged_adamw_8bit, # 8bit优化器再省一波显存 ) # 8. SFTTrainer是trl库的封装管理整个训练循环 trainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetdataset, argstraining_args, formatting_funcformat_func, max_seq_length2048, # 输入序列最大长度 ) # 9. 开始训练 trainer.train()这里有几个参数你必须理解否则就是瞎抄作业per_device_train_batch_size1是因为7B模型就算做了4bit量化单个样本在显存里展开后也会吃很多空间。梯度累积gradient_accumulation_steps8就是为了弥补batch size太小的问题它让模型先累积8个小batch的梯度再更新一次参数效果上模拟了batch size8。learning_rate2e-4是LoRA微调的常见起始值比全量微调的1e-5~3e-5大很多因为LoRA只训练少量参数需要一个相对激进的学习率才能在有限的训练步数内看到效果。max_seq_length2048是你在训练时能做的最有效的显存控制开关。同样一个7B模型2048序列长度和4096序列长度的显存占用差距非常明显。如果你的数据都是短文本比如客服问答512就够用了训练速度能快一大截。3.3 训练过程监控与常见中断处理训练跑起来之后你大概率会遇到下面这几种情况我按出现概率排序训练刚开始一两步就报OOM这最常见。排查顺序先看训练参数里的max_seq_length是不是太大再看是不是有别的程序占着显存比如浏览器开了一堆视频、旧训练的进程没杀干净最后再看bnb_4bit_compute_dtype和fp16是否设置冲突。有一个小技巧把max_seq_length先设成512确认能跑起来再逐步增加这样能快速判断显存的极限在哪里。训练途中突然卡住不动日志最后一行停在某个step显卡利用率掉到0%这种情况多半是数据里混入了异常样本比如某个JSON少了字段、文本里出现了过长的重复字符。我的排查方法是先单独写个小脚本逐个读取训练数据并tokenize计算长度和格式把有问题的行打印出来直接改掉。不要指望训练框架帮你容错训练数据必须自己清洗。训练到一半显存溢出这个通常是因为某些长文本样本超预期地占用了显存。虽然你设置了max_seq_length2048但实际每个batch是按该batch最长的样本动态padding的如果一批里恰好都是2048长度的大样本激活值就会超出预算。解决办法是把max_seq_length余量控制得更保守一点或者设置packingFalse让每条样本独立补齐。训练日志显示loss在下降但下降得极其缓慢甚至反复横跳。不要急着加学习率先确认你的数据是不是大量重复。重复数据会让模型在一个模式里打转loss好看但实际效果很烂。我连续微调过多次之后发现数据的多样性和正确格式化比调参重要十倍。3.4 模型合并与导出从训练态到可部署态训练完成后你手里的checkpoint只是一些LoRA适配器权重它本身不能单独使用必须和基座模型合并。下面这段代码把训练好的LoRA权重合并回基座模型导出成一个完整的、可以直接部署的模型目录from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer import torch base_model AutoModelForCausalLM.from_pretrained( Qwen/Qwen2.5-7B-Instruct, device_mapauto, torch_dtypetorch.bfloat16, ) model PeftModel.from_pretrained(base_model, ./qwen-lora-checkpoints/checkpoint-600) merged_model model.merge_and_unload() merged_model.save_pretrained(./qwen-merged) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-7B-Instruct) tokenizer.save_pretrained(./qwen-merged)导出的qwen-merged目录就是一个标准模型目录可以直接被transformers加载。这一步不要省我见过有人直接把LoRA适配器目录当成最终模型去部署结果服务端加载模型时根本不知道要套基座模型各种乱七八糟的报错。如果你想把这个模型转成GGUF格式给Ollama或llama.cpp用步骤是在WSL2里把llama.cpp仓库拉下来用它对合并后的模型目录执行转换git clone https://github.com/ggml-org/llama.cpp cd llama.cpp python3 -m pip install -r requirements.txt python3 convert_hf_to_gguf.py /path/to/qwen-merged --outfile qwen-merged.gguf --outtype f16 # 然后量化q8_0或q4_k_m是比较常用的档位 ./llama-quantize qwen-merged.gguf qwen-merged-Q4_K_M.gguf q4_k_m4. API服务部署模型训练完怎么把它变成能用的服务4.1 部署方案横向对比Ollama vs vLLM vs FastAPI自研模型微调完、导出好之后下一步就是把它变成一个可以被外部程序调用的API服务。这一步我试过三条路线各有适用场景。Ollama是现在个人部署模型API最省事的方案。它把模型加载、量化格式管理、OpenAI兼容端点全封装好了一个命令就能启动服务。缺点是自定义逻辑能力弱你没法在每次请求前后插入自己的业务逻辑比如查询数据库、做RAG检索、重写prompt格式。vLLM是性能取向的方案吞吐量和并发能力很强适合服务多用户、有连续大量请求的场景。但它在Windows原生的支持还不算完整一般要跑在WSL2的Docker里对显存和CUDA版本也有要求上手难度明显高一档。如果你只是自己调试、内网使用没必要上vLLM。FastAPI自研是最灵活也最可控的方案。你完全掌控模型加载、请求处理、返回格式可以在里面加入鉴权、日志、上下文管理、业务逻辑。缺点是一切都要自己写包括并发的坑也要自己踩。我推荐机会主义者先习惯这种方式很多生产环境的需求只有自研才能满足。方案易用性并发性能自定义能力适合场景Ollama极高中低快速起服务、内网个人使用vLLM中高中多用户高并发生产环境FastAPI自研中低中可调优高业务耦合、二次开发、集成进现有系统4.2 方案AOllama一行命令起服务如果你不折腾训练这件事只部署现成的开源模型Ollama有一个Windows原生版直接装就行。装好后你甚至不用碰WSL2直接在Windows里起服务。但如果你训练了自定义模型把它导入Ollama也很快。Ollama支持从GGUF格式创建模型你在3.4节转换好的qwen-merged-Q4_K_M.gguf就能直接用。写一个ModelfileFROM ./qwen-merged-Q4_K_M.gguf TEMPLATE {{ .Prompt }}然后执行ollama create my-qwen -f Modelfile ollama serve服务起来后默认监听11434端口它提供了OpenAI兼容的API路径比如/v1/chat/completions和/v1/embeddings。这意味着你用OpenAI SDK的代码只需要改一下base_url就能切到本地模型上非常省事。这里要提醒几个Windows环境下的Ollama配置点因为默认绑定的地址是127.0.0.1要让局域网里其他电脑能访问你需要把环境变量OLLAMA_HOST设为0.0.0.0OLLAMA_NUM_PARALLEL控制模型同时处理几个请求这个值设得太高会显著增加显存压力我建议按你的显存情况从2开始试OLLAMA_KEEP_ALIVE控制模型在服务空转时驻留显存的时间设为24h可以避免每次请求都重新加载模型一顿模型加载等十几秒的滋味没人想受。4.3 方案BFastAPI自研API服务的完整模板比起Ollama我更常用的是FastAPI自研方案因为一旦要接业务逻辑、做自定义prompt模板、记录用户请求日志Ollama那套就很难扩展。下面这个模板可以直接跑import asyncio import time from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List, Optional from transformers import AutoModelForCausalLM, AutoTokenizer import torch app FastAPI() semaphore asyncio.Semaphore(4) # 控制同时推理的请求数 model_name ./qwen-merged # 3.4节导出的模型目录 model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto ) tokenizer AutoTokenizer.from_pretrained(model_name) # 请求体要和OpenAI的chat格式保持一致 class Message(BaseModel): role: str content: str class ChatRequest(BaseModel): model: Optional[str] qwen messages: List[Message] max_tokens: int 512 temperature: float 0.7 app.get(/v1/models) async def list_models(): return {data: [{id: qwen, object: model}]} app.post(/v1/chat/completions) async def chat_completions(req: ChatRequest): try: async with semaphore: prompt tokenizer.apply_chat_template( [m.dict() for m in req.messages], tokenizeFalse, add_generation_promptTrue ) inputs tokenizer(prompt, return_tensorspt).to(cuda) def run_generate(): with torch.no_grad(): outputs model.generate( **inputs, max_new_tokensreq.max_tokens, temperaturereq.temperature, pad_token_idtokenizer.eos_token_id, ) return outputs loop asyncio.get_running_loop() outputs await loop.run_in_executor(None, run_generate) answer tokenizer.decode( outputs[0][inputs.input_ids.shape[1]:], skip_special_tokensTrue ) return { choices: [{ message: {role: assistant, content: answer}, }] } except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)这段代码里藏着一个大坑我单独拎出来讲你看到的asyncio.Semaphore(4)它限制的是同时进入这个handler的协程数量但model.generate()是同步阻塞的CPU/GPU密集操作。如果你直接在async函数里调用它四个并发请求会排队串行执行Semaphore形同虚设。正确的做法是把generate扔到线程池里loop.run_in_executor让它们真正并行跑。这是典型的Windows本地部署容易忽视的并发问题不处理的话你的API一旦同时来几个请求响应时间会瞬间暴涨。4.4 服务落地细节端口、开机自启、局域网访问服务代码写完最后一步是让它在本机老老实实跑起来并且想开机就开机局域网里其他同事也能访问。先说说端口问题。你可能会遇到服务启动时报Address already in use这在Windows下挺常见。先用命令查一下端口被谁占了netstat -ano | findstr :8000输出结果里的PID就是占用进程的进程号然后强制结束它taskkill /PID 12345 /F如果你希望服务在Windows开机时自动启动最简单的方案是用任务计划程序新建一个任务触发器选择“计算机启动时”操作选择启动你的启动脚本比如一个.bat文件里面写上启动FastAPI或Ollama的命令。用系统服务方式NSSM也可以但任务计划程序对大多数人来说更直观改起来也方便。局域网访问这块如果你用了.wslconfig里的networkingModemirroredWSL2和Windows共享网络windows防火墙放行对应端口即可。如果没开mirrored模式WSL2和Windows是NAT关系外部设备访问Windows的某个端口并不等于访问WSL2里的服务这时候需要用端口转发。我的建议还是直接开mirrored省心。最后提两个和API服务生态相关的工具GPUSTack适合你要管理多块GPU、给不同模型动态分配显存资源时用它支持GPU资源池化和模型部署编排Dify则适合你要基于模型API快速搭建知识库问答、Agent这类上层应用。这俩都是开源项目官方文档有Windows部署指引方向对的话能省很多事。5. 常见问题与排查技巧实录5.1 问题速查表Windows大模型开发高频踩坑下面的表格是我和身边朋友在实际操作中遇到的最高频问题你遇到什么奇怪现象先来这儿查一遍现象根因解决动作WSL2里跑nvidia-smi报找不到设备Windows显卡驱动版本太低或没装干净升级到最新驱动用DDU工具清理后重装驱动CUDA out of memory显存被其他程序占用或序列长度太大关掉浏览器硬解加速调低max_seq_length降低batch size训练速度突然变慢散热降频或电源计划变省电模式检查温度插电并开启高性能电源计划清理散热风扇WSL2内存只用了4GB就卡死.wslconfig没生效修改.wslconfig后执行wsl --shutdown然后重启WSLDocker Desktop提示context错误WSL2后端没正常启动执行wsl --shutdown后重启Docker Desktop或重置contextWSL2里访问/mnt/c速度极慢跨文件系统IO开销把代码、数据全部移到WSL2自家目录下Windows Defender实时扫描拖慢训练模型文件读写频繁触发扫描把项目目录加入排除项局域网其他设备访问不了API服务只监听127.0.0.1或防火墙拦截设置OLLAMA_HOST0.0.0.0防火墙放行对应端口开机后WSL2服务不自动跑没设置自启动任务用任务计划程序注册开机启动脚本Windows更新后驱动掉了系统更新覆盖了显卡驱动重新安装NVIDIA驱动可以暂时关闭自动驱动更新5.2 几个值得单独讲的操作细节Windows Defender的实时保护在读取/写入大量模型权重文件的时候性能开销非常明显。我实测过同样读取一个5GB的GGUF模型文件开启Defender实时扫描和排除之后的耗时差了将近三倍。训练和加载模型前建议把模型目录、训练数据目录、项目工作目录都加入排除项。操作路径Windows安全中心 → 病毒和威胁防护 → 管理设置 → 排除项 → 添加文件夹。.wslconfig改完之后一定要用wsl --shutdown彻底重启WSL不是关掉终端窗口就完了。很多人改了内存配额没生效就是没做这一步。Docker Desktop如果和WSL2配合出问题最常见的是“context not found”或者“Cannot connect to the Docker daemon”。不用急着重装先执行wsl --shutdown重启WSL然后重新打开Docker Desktop。如果还是不行再执行docker context use default。Docker Desktop本身和WSL版本的兼容性也是个坑建议保持WSL版本在最新。5.3 这套方案的真实感受和后续扩展从我折腾这段时间的经验来看Windows 11上做本地大模型训练与API服务部署本质上是接受一个事实你在Windows上使用WSL2这个中转层把绝大多数工作放进Linux环境里Windows只干宿主该干的活。这个架构一旦搭稳了后续扩展非常顺你可以继续加模型、加训练数据、加API接口一切都像在Linux服务器上一样操作。对于还想往后走的人我的建议是下一步加上RAG。微调让模型学会了你的格式和风格但模型本身的知识是有限的训练数据之外的问题它很容易胡编。把向量数据库比如Milvus的本地版或Chroma接在FastAPI服务和模型之间用户提问时先检索相关文档片段再拼进prompt让模型回答正确率和实用性会提升一个量级。最后说点实在的我一开始花了大把时间在Windows原生环境里死磕训练框架总是被各种库不兼容搞得火冒三丈。后来承认WSL2才是最合适的工作台一切问题迎刃而解。如果你正在Windows上反复折腾环境别跟平台较劲直接切换到WSL2这套方案把时间省下来花在数据和模型调优上产出会来得快很多。
返回列表