本地部署Llama 3的Python环境搭建全指南 1. 为什么现在还要亲手搭一个本地 Llama 3 的 Python 环境这真不是在重复造轮子“本地部署 Llama 3 的 Python 环境搭建”——光看这个标题你脑子里可能已经浮现出两种人一种是刚在 Hugging Face 上点开meta-llama/Meta-Llama-3-8B-Instruct页面、手指悬在“Download”按钮上却迟迟不敢点的新人另一种是刚被公司运维通知“生产环境禁止拉取外部模型权重”转身就打开 VS Code 开始删.gitignore里venv/那一行的老手。我试过这两种状态也踩过所有你能想到的坑从 pip install torch 报错ERROR: Could not find a version that satisfies the requirement torch到OSError: libcuda.so.1: cannot open shared object file卡在模型加载第一行再到用llama-cpp-python跑通了但发现 token 生成速度比煮一壶咖啡还慢……这些都不是玄学全是可定位、可复现、可解决的工程细节。核心关键词“本地”“Llama”“Python”“环境搭建”背后藏着三个真实需求第一是可控性——你得知道模型权重存在哪块硬盘、推理时内存怎么分配、日志往哪个文件写第二是可调试性——当 prompt 没有按预期触发 function calling你能直接import pdb; pdb.set_trace()进transformers的generate()方法里看 attention mask 是怎么算歪的第三是可迁移性——今天在你那台 32G 内存的 MacBook Pro 上跑通的环境明天换到实验室那台带 A100 的 Ubuntu 服务器上改三行配置就能复用而不是重头再来一遍“pip install 全家桶”。这不是为了炫技而是当你需要把 Llama 3 接进一个老旧的 ERP 系统做智能工单分类或者给内部知识库加个 RAG 模块时唯一能让你不被“API 调用超时”和“月度额度用完”卡脖子的底层能力。零基础的朋友别慌Python 安装、CUDA 驱动、模型量化格式这些概念我会用“装打印机驱动”的逻辑来类比——你不需要懂 USB 协议栈但得知道驱动装错版本会导致打印出来全是乱码而我们接下来要做的就是帮你把每一步的“驱动版本号”都标清楚。2. 整体设计思路为什么放弃一键脚本坚持手动分层搭建很多人看到“本地部署 Llama 3”第一反应是去搜ollama run llama3或者dify local deploy这没错但它们像预装好所有 App 的 iPhone——你用得很爽可一旦某个 App 崩溃你连进程 ID 都看不到。我们的方案是回归 Linux 哲学“每个程序只做好一件事”把整个环境拆成四个严格解耦的层次运行时层Python 解释器→ 计算层CUDA/cuDNN 或 CPU 加速库→ 框架层PyTorch / llama-cpp-python→ 模型层GGUF 量化权重 tokenizer。这种分层不是为了显摆技术深度而是为了解决三个高频痛点第一版本冲突的精准隔离。比如你系统里已有 Python 3.9 用于数据分析但 Llama 3 的某些 tokenizer 依赖 Python 3.11 的新语法又比如你的 PyTorch 2.0.1 是用 CUDA 11.8 编译的但新显卡驱动只支持 CUDA 12.1。一键脚本会强行覆盖全局环境而分层方案让你用pyenv创建独立 Python 版本用conda创建隔离的 CUDA 环境互不干扰。第二资源消耗的透明可控。transformers默认加载模型到 GPU 显存但如果你只有 6GB 显存的 RTX 3060它会直接 OOM而llama-cpp-python允许你用n_gpu_layers35精确指定多少层放 GPU、多少层放 CPU 内存。这种控制权只有手动配置才能拿到。第三故障排查的路径清晰。当推理卡住时你能快速判断是 Python 层的import torch失败运行时层问题还是torch.cuda.is_available()返回 False计算层问题或是Llama.from_pretrained()报KeyError: model.layers.0模型层格式错误。每一层都有明确的验证命令失败即止不浪费一秒钟在无效尝试上。所以我们不推荐pip install llama这种模糊包它实际是 llama-index 的缩写和 Llama 3 毫无关系也不用docker run -p 11434:11434 --gpus all ollama/ollama这种黑盒容器。我们要的是每个pip install命令后都能python -c import xxx; print(xxx.__version__)验证成功每个nvidia-smi输出都能对应到具体的 GPU 内存分配。这就像修车——你得先分清是火花塞问题还是油路堵塞而不是直接把整台发动机换掉。3. 核心细节解析Python 环境、CUDA 驱动、框架选型的硬核取舍3.1 Python 解释器为什么必须用 pyenv virtualenv而不是系统自带 PythonMac 和 Linux 系统自带的 Python如 macOS 的/usr/bin/python3是系统级组件升级或卸载可能破坏 Finder、Spotlight 等原生功能。Windows 的 Python 安装包则常因 PATH 冲突导致pip命令指向错误位置。我见过最惨的案例某位同事在 Windows 上用官网安装包装了 Python 3.12结果pip install torch下载的是针对 Python 3.11 编译的 wheel报错ERROR: xxx.whl is not a supported wheel on this platform折腾两天才发现python -m pip --version和pip --version显示的 Python 路径完全不同。正确做法是pyenv 管理 Python 版本 virtualenv 隔离项目环境。pyenv 不是另一个 Python而是“Python 的版本管理器”它通过修改PATH环境变量让 shell 在执行python命令时优先找到你指定的版本。具体操作# macOS 安装 pyenv需先装 Homebrew brew update brew install pyenv # Linux 安装Ubuntu/Debian curl https://pyenv.run | bash # 然后将以下三行加入 ~/.bashrc 或 ~/.zshrc export PYENV_ROOT$HOME/.pyenv export PATH$PYENV_ROOT/bin:$PATH eval $(pyenv init -) # 重新加载配置 source ~/.zshrc # macOS Catalina 及以后默认 zsh # 查看可用 Python 版本Llama 3 官方推荐 3.10 pyenv install --list | grep 3\.[10-12] # 安装 Python 3.11.9稳定且兼容性好 pyenv install 3.11.9 # 设为当前目录的局部版本cd 进项目文件夹后执行 pyenv local 3.11.9 # 验证此时 python -V 应输出 3.11.9 python -V提示pyenv local会在当前目录生成.python-version文件Git 提交时建议加入.gitignore避免团队成员强制使用同一版本。如果需要全局默认版本用pyenv global 3.11.9。装好 Python 后必须创建虚拟环境。virtualenv venv或python -m venv venv会复制一份干净的 Python 解释器和pip所有pip install都只影响这个venv文件夹。激活命令source venv/bin/activateLinux/macOS或venv\Scripts\activate.batWindows后终端提示符前会出现(venv)这是唯一安全的开发状态。切记任何pip install前必须确认(venv)在提示符上否则就是在污染全局环境。3.2 CUDA 驱动与工具链NVIDIA 显卡用户必过的三道关卡如果你的机器没有 NVIDIA GPU跳过本节直接用 CPU 模式性能会慢 5-10 倍但绝对稳定。有 GPU 的同学请拿出手机拍下nvidia-smi命令的输出我们来逐行解读----------------------------------------------------------------------------- | NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 | |--------------------------------------------------------------------------- | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | || | 0 NVIDIA RTX 4090 Off | 00000000:01:00.0 On | N/A | | 32% 45C P2 98W / 450W | 2852MiB / 24576MiB | 0% Default | ---------------------------------------------------------------------------关键信息有三处Driver Version535.104.05→ CUDA Version12.2→ GPU 型号RTX 4090。这三个数字必须形成闭环你的 PyTorch wheel 必须匹配 CUDA 12.2而 CUDA 12.2 又要求驱动版本 ≥ 525官方文档明确写的最低要求。如果nvidia-smi显示驱动版本是 470那pip install torch2.3.0cu121一定失败因为 cu121 表示 CUDA 12.1需要驱动 ≥ 450但你的驱动太老不支持新 CUDA 的 API。解决方案不是升级驱动可能破坏现有系统而是降级 PyTorch 版本以匹配现有驱动。查 NVIDIA 官网的 CUDA Toolkit Archive 找到你的驱动版本支持的最高 CUDA 版本再查 PyTorch 官网的 Previous Versions 选择对应 CUDA 版本的 wheel。例如驱动 470 → 最高支持 CUDA 11.4 → 安装torch1.12.1cu113注意cu113 是 CUDA 11.3因为 11.4 的 wheel 在 PyTorch 官网未提供11.3 是最接近的稳定版。注意不要用conda install pytorch自动选 CUDA 版本conda 有时会选错必须用pip install指定完整 URL。例如pip install torch2.3.0cu121 torchvision0.18.0cu121 --index-url https://download.pytorch.org/whl/cu121这个 URL 中的cu121是硬编码确保 wheel 包含正确的 CUDA 二进制。验证 CUDA 是否真正可用import torch print(torch.__version__) # 应输出 2.3.0cu121 print(torch.cuda.is_available()) # 必须是 True print(torch.cuda.device_count()) # 应 ≥ 1 print(torch.cuda.get_device_name(0)) # 应输出你的 GPU 型号如 NVIDIA RTX 4090如果is_available()是 False90% 是驱动/CUDA/PyTorch 版本不匹配剩下 10% 是权限问题Linux 下需将用户加入video组sudo usermod -aG video $USER然后重启。3.3 框架选型PyTorch vs llama-cpp-python到底该用哪个这是新手最容易纠结的问题。简单说想快速验证模型效果用 PyTorch想长期部署、节省显存、跨平台运行用 llama-cpp-python。PyTorch 方案transformers accelerate优势API 最标准Hugging Face 生态无缝对接支持 LoRA 微调、Flash Attention 加速、多卡并行。适合需要修改模型结构、做研究实验的场景。劣势显存占用大。Llama 3-8B FP16 模型需约 16GB 显存30B 模型需 60GB远超消费级显卡。即使启用device_mapautoaccelerate也会把部分层放到 CPU导致推理速度暴跌。llama-cpp-python 方案优势基于 C 的 llama.cpp 移植支持 GGUF 量化格式如Q4_K_M8B 模型可压缩到 4.5GB30B 模型压到 18GBRTX 309024GB就能跑 30B。CPU 模式下也能跑慢但稳Mac M 系列芯片原生支持 Metal 加速。劣势API 较底层不支持 Hugging Face 的pipeline需手动处理 tokenizer、prompt template。我的实操建议是起步用 llama-cpp-python因为它能让你在 5 分钟内看到第一个 token 输出等模型逻辑跑通后再用 PyTorch 做精度对比或微调。安装命令# 必须指定 --no-deps否则会自动装 torch可能冲突 pip install --no-deps llama-cpp-python # 然后手动装兼容的 torch如果已装好跳过 pip install torch2.3.0cu121 --index-url https://download.pytorch.org/whl/cu121 # 验证 python -c from llama_cpp import Llama; print(OK)实测心得llama-cpp-python 的n_gpu_layers参数是灵魂。RTX 409024GB跑 8B 模型设n_gpu_layers45总层数 3245 表示全部放 GPURTX 306012GB跑 8B设n_gpu_layers25留 7 层在 CPU 内存速度损失不到 15%但显存占用从 12GB 降到 8GB系统不卡顿。这个值不是拍脑袋而是llama.cpp源码里llama_model_loader.cpp的n_layer字段决定的不同模型层数不同8B 是 3270B 是 80必须查模型 config.json。4. 实操过程从零开始搭建可运行的 Llama 3 环境含完整命令与参数说明4.1 环境初始化创建项目目录与 Python 环境我们从一个干净的项目目录开始避免路径混乱。假设项目名为llama3-local# 创建项目目录 mkdir llama3-local cd llama3-local # 初始化 git方便后续版本管理 git init echo venv/ .gitignore echo __pycache__/ .gitignore echo *.log .gitignore # 用 pyenv 设置 Python 版本确保已按 3.1 节装好 pyenv pyenv local 3.11.9 # 创建虚拟环境 python -m venv venv # 激活虚拟环境Linux/macOS source venv/bin/activate # 验证 Python 版本 python -V # 应输出 Python 3.11.9 # 升级 pip 到最新版避免旧 pip 无法识别新 wheel 格式 pip install --upgrade pip # 安装基础工具setuptools, wheel 是构建包必需 pip install setuptools wheel注意Windows 用户请用venv\Scripts\activate.bat激活且后续所有source命令替换为对应 bat 文件。PowerShell 用户需先执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser允许脚本运行。4.2 安装核心框架PyTorch 与 llama-cpp-python 的双轨策略我们采用“双轨安装”先装 llama-cpp-python主推再装 PyTorch备用。这样即使 PyTorch 安装失败也不影响主流程。# 安装 llama-cpp-python重点必须加 --no-deps pip install --no-deps llama-cpp-python # 如果你有 NVIDIA GPU安装匹配的 PyTorch按 3.2 节确定版本 # 示例CUDA 12.1 驱动 535.x pip install torch2.3.0cu121 torchvision0.18.0cu121 --index-url https://download.pytorch.org/whl/cu121 # 如果你用 Apple Silicon MacM1/M2/M3装 Metal 版本 # pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/apple # 如果你只有 CPU装 CPU 版本最稳 # pip install torch2.3.0cpu torchvision0.18.0cpu --index-url https://download.pytorch.org/whl/cpu # 验证两个框架 python -c from llama_cpp import Llama import torch print(llama-cpp-python OK) print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()}) 如果最后两行输出CUDA available: True恭喜计算层打通。如果为 False回到 3.2 节检查驱动/CUDA/PyTorch 版本链。4.3 下载并验证 Llama 3 模型GGUF 格式是本地部署的生命线Llama 3 官方只发布 Hugging Face 格式.safetensors但本地部署强烈推荐GGUF 格式因为它是 llama.cpp 专用的、支持量化和流式加载的二进制格式。Hugging Face 上搜索llama-3找TheBloke组织发布的量化模型例如TheBloke/Llama-3-8B-Instruct-GGUF8B 指令微调版TheBloke/Llama-3-70B-Instruct-GGUF70B 指令微调版进入模型页面点击Files and versions你会看到一堆文件名如llama-3-8b-instruct.Q4_K_M.gguf、llama-3-8b-instruct.Q5_K_M.gguf。后缀含义Q4_K_M4-bit 量化K 分组M 精度平衡速度与质量推荐新手Q5_K_M5-bit质量更好体积稍大12GB vs 8B 的 5.2GBQ8_08-bit几乎无损但体积大15GB下载命令用wget或浏览器# 创建 models 目录存放模型 mkdir models # 下载 8B Q4_K_M 版本约 4.5GB适合入门 cd models wget https://huggingface.co/TheBloke/Llama-3-8B-Instruct-GGUF/resolve/main/llama-3-8b-instruct.Q4_K_M.gguf # 回到项目根目录 cd ..提示国内下载慢用hf-mirror.com镜像站。把 URL 中的huggingface.co替换为hf-mirror.com例如https://hf-mirror.com/TheBloke/Llama-3-8B-Instruct-GGUF/resolve/main/llama-3-8b-instruct.Q4_K_M.gguf验证模型完整性防止下载中断# 检查文件大小Q4_K_M 应为 ~4.5GB ls -lh models/llama-3-8b-instruct.Q4_K_M.gguf # 用 llama.cpp 自带的工具检查 header需先装 llama.cpp # git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make # ./llama-cli -m models/llama-3-8b-instruct.Q4_K_M.gguf -p Hello -n 1 # 如果输出 token说明模型可读。4.4 编写第一个推理脚本用 llama-cpp-python 跑通 Hello World创建inference.py这是你和 Llama 3 的第一次对话from llama_cpp import Llama import time # 初始化模型路径、参数详解见下表 llm Llama( model_path./models/llama-3-8b-instruct.Q4_K_M.gguf, # 模型文件路径 n_ctx4096, # 上下文长度Llama 3 支持 8K但 4K 更稳 n_threads8, # CPU 线程数设为物理核心数 n_gpu_layers45, # GPU 层数RTX 4090 设 453060 设 25 verboseTrue, # 打印详细日志调试必备 ) # 构造 Llama 3 的标准 prompt template必须否则效果差 # 参考官方文档https://llama.meta.com/docs/model-cards-and-prompt-formats/meta-llama-3/ prompt |begin_of_text||start_header_id|system|end_header_id| You are a helpful AI assistant.|eot_id||start_header_id|user|end_header_id| Hello, who are you?|eot_id||start_header_id|assistant|end_header_id| # 开始推理 start_time time.time() output llm( prompt, max_tokens256, # 最大生成 token 数 stop[|eot_id|], # 遇到此字符串停止Llama 3 的 EOS token echoFalse, # 不回显输入 prompt temperature0.7, # 创造性控制0.7 是平衡值 ) end_time time.time() # 打印结果 print(Generated text:) print(output[choices][0][text]) print(f\nTime taken: {end_time - start_time:.2f} seconds)运行它python inference.py如果看到类似输出Generated text: I am an AI assistant created by Meta, designed to help with a wide range of tasks including answering questions, writing stories, coding, logical reasoning, and more. Time taken: 2.34 seconds恭喜你已成功本地部署 Llama 3。注意Time taken这个数字RTX 4090 应 ≤ 3 秒RTX 3060 应 ≤ 8 秒Mac M2 Max 应 ≤ 12 秒。如果超过 30 秒检查n_gpu_layers是否设得太低导致大量计算在 CPU或n_ctx是否过大4096 是安全值8192 可能爆显存。参数名推荐值说明调整逻辑n_ctx4096上下文窗口大小超过 4096 可能 OOM低于 2048 影响长文本理解n_threadsCPU 物理核心数CPU 并行线程Linux/macOS 可设高些Windows 建议 ≤ 6n_gpu_layersGPU 显存 ÷ 0.5GBGPU 加速层数RTX 3060 (12GB) → 24, RTX 4090 (24GB) → 48max_tokens256单次生成最大 token太大会卡住太小回答不完整temperature0.7随机性0.0 最确定1.0 最随机0.7 是通用值4.5 进阶用 PyTorch 加载 Hugging Face 原生模型当你要微调时虽然 GGUF 是部署首选但如果你想用 LoRA 微调、或测试原始精度就得走 PyTorch 路线。创建hf_inference.pyfrom transformers import AutoTokenizer, AutoModelForCausalLM, pipeline import torch # 加载 tokenizer必须和模型配套 tokenizer AutoTokenizer.from_pretrained( meta-llama/Meta-Llama-3-8B-Instruct, use_fastTrue, trust_remote_codeTrue ) # 加载模型关键device_mapauto 自动分配 GPU/CPU model AutoModelForCausalLM.from_pretrained( meta-llama/Meta-Llama-3-8B-Instruct, torch_dtypetorch.bfloat16, # Llama 3 官方推荐 bfloat16 device_mapauto, # 自动分配无需指定 cuda:0 trust_remote_codeTrue ) # 创建 pipeline简化接口 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens256, do_sampleTrue, temperature0.7, top_k50, top_p0.95, ) # 构造 promptHugging Face 格式 messages [ {role: system, content: You are a helpful AI assistant.}, {role: user, content: Hello, who are you?}, ] # 用 tokenizer.apply_chat_template 格式化Llama 3 必须 prompt tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue # 自动加 |start_header_id|assistant|end_header_id| ) # 生成 outputs pipe(prompt) print(HF Generated text:) print(outputs[0][generated_text][len(prompt):])运行前需先pip install transformers accelerate bitsandbytes并确保HF_HOME环境变量指向缓存目录避免下载到 C 盘export HF_HOME/path/to/your/cache # Linux/macOS # Windows: set HF_HOMEC:\path\to\cache注意首次运行会自动下载 15GB 的safetensors权重耐心等待。如果device_mapauto报错手动指定device_map{: cuda:0}。5. 常见问题与排查技巧实录那些让我熬夜到凌晨三点的坑5.1 “ImportError: libcudnn.so.8: cannot open shared object file” —— CUDA 库找不到现象import torch成功但torch.cuda.is_available()返回 Falsenvidia-smi正常显示 GPU错误日志里反复出现libcudnn.so.8找不到。原因PyTorch 依赖 cuDNNCUDA Deep Neural Network library而pip install torch下载的 wheel 只包含 CUDA runtime不包含 cuDNN。系统级 cuDNN 未安装或版本不匹配。排查步骤查 PyTorch 版本对应的 cuDNN 要求PyTorch 2.3.0cu121 要求 cuDNN 8.9.2 官方文档 。检查系统是否安装 cuDNNls /usr/lib/x86_64-linux-gnu/ | grep cudnn # 应看到 libcudnn.so.8 或 libcudnn.so.8.9.2如果没有去 NVIDIA 官网下载 cuDNN 8.9.2 for CUDA 12.1解压后复制文件sudo cp cuda/include/cudnn*.h /usr/local/cuda/include sudo cp cuda/lib/libcudnn* /usr/local/cuda/lib64 sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*终极方案推荐不用系统 cuDNN改用conda安装预编译环境conda create -n llama3 python3.11 conda activate llama3 conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidiaconda 会自动处理 cuDNN 依赖一劳永逸。5.2 “OSError: unable to open file” —— GGUF 模型路径或权限错误现象Llama(model_path...)报错OSError: unable to open file但ls -l确认文件存在。原因90% 是路径错误10% 是文件权限。GGUF 文件必须是可读的且路径必须是绝对路径或相对于当前工作目录的正确相对路径。排查清单✅ 运行pwd确认当前目录ls models/确认文件在models/下。✅ 在 Python 脚本中用os.path.abspath(./models/xxx.gguf)打印绝对路径复制到终端ls -l验证。✅ 检查文件权限ls -l models/xxx.gguf应有rw-如-rw-r--r--如果没有chmod 644 models/xxx.gguf。✅ Windows 用户注意反斜杠\Python 中必须用正斜杠/或双反斜杠\\。实测技巧在Llama()初始化前加一行 debugimport os model_path ./models/llama-3-8b-instruct.Q4_K_M.gguf print(fTrying to load: {os.path.abspath(model_path)}) print(fFile exists: {os.path.exists(model_path)}) llm Llama(model_pathmodel_path, ...)5.3 “RuntimeError: Expected all tensors to be on the same device” —— 混合设备错误现象用 PyTorch 加载模型后model.generate()报错Expected all tensors to be on the same device提示 input_ids 在 cpumodel 在 cuda。原因tokenizer.encode()默认返回 CPU tensor而 model 在 GPU没做.to(cuda)。修复代码# 错误写法 inputs tokenizer(prompt, return_tensorspt) # inputs[input_ids] 是 cpu tensor # 正确写法 inputs tokenizer(prompt, return_tensorspt).to(cuda) # 关键 outputs model.generate(**inputs, max_new_tokens256)更稳妥方案用pipeline它自动处理设备转移pipe pipeline(text-generation, modelmodel, tokenizertokenizer, devicecuda:0) # device 参数指定 GPUpipeline 内部自动 transfer5.4 “Token generation stuck at 0%” —— 推理卡死的三大元凶现象脚本运行后光标一直闪烁无输出htop显示 Python 进程 CPU 占用 100%但nvidia-smi显存不动。元凶 Top 3Stop tokens 错误Llama 3 的 EOS token 是|eot_id|不是|endoftext|或/s。如果stop[|eot_id|]拼错模型会一直生成直到max_tokens用完看起来就是卡住。Context overflown_ctx8192但 prompt 已占 7000 tokens剩余空间不足模型在 padding 上死循环。用tokenizer.encode(prompt)检查长度。GPU 内存碎片之前运行崩溃留下内存碎片nvidia-smi显示显存占用高但torch.cuda.memory_allocated()低。重启 Python 进程或nvidia-smi --gpu-reset需 root。快速诊断脚本# 在推理前插入 print(fPrompt length: {len(tokenizer.encode(prompt))}) print(fAvailable context: {llm.n_ctx - len(tokenizer.encode(prompt))}) print(fStop tokens: {stop}) # 如果 available context 100果断缩减 prompt 或增大 n_ctx5.5 “Mac M2 跑得比 CPU 还慢” —— Metal 加速未启用现象Apple Silicon Mac 上llama-cpp-python默认用 CPU速度极慢nvidia-smi当然没输出因为没 NVIDIA。原因llama-cpp-python 需要编译时启用 Metal 支持而pip install默认 wheel 不含 Metal。解决方案# 卸载旧版 pip uninstall llama-cpp-python # 从源码编译