MAC上采用Transformers官方库对Qwen3.5-27B模型进行推理
本文介绍了在Mac系统上使用Transformers库对Qwen3.5-27B大模型进行推理的环境配置和实现方法。主要内容包括:1) 推荐使用Python 3.11、PyTorch 2.6和最新版Transformers库的环境配置;2) 通过conda创建环境并安装核心依赖的详细步骤;3) 提供了完整的非量化版模型推理代码示例;4) 特别指出在macOS上GPTQ量化方案存在重大限制,虽然可以安
MAC上采用Transformers官方库对Qwen3.5-27B模型进行推理
1. 推理环境要求
python>3.8,建议3.10
Transformers 库版本 ≥4.37.0(推荐最新版)
建议配置如下:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.11 | PyTorch + Transformers 最稳定(mac 上 torch+mps 在3.11更稳定),3.10也可以 |
| PyTorch | 2.6 | macOS MPS稳定 |
| torchvision | 0.21 | 对应 torch 2.6 |
| transformers | ≥4.57 | 支持 Qwen3.5 |
| accelerate | ≥1.2 | 推理优化 |
| safetensors | 最新 | 加载权重 |
前面python,pytorch,torchvision,torchaudio等建议直接通过conda配置,后续其他建议通过创建pyproject.toml(类似于requirement.txt)通过uv进行安装
2. 环境配置(正常非量化版Qwen3.5-27B)
先创建环境:
conda create -n qwen35 python=3.11
conda activate qwen35
用 Conda 安装 PyTorch 核心库
macOS(MPS)推荐官方源:
conda install pytorch==2.6 torchvision==0.21 torchaudio -c pytorch
验证:
python - <<EOF
import torch
print(torch.__version__)
print(torch.backends.mps.is_available())
EOF
输出:
2.6.x
True
说明 MPS GPU可用。
pip install uv
在项目目录创建pyproject.toml
[project]
name = "qwen35-local-inference"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"transformers>=4.57.0",
"accelerate>=1.2.0",
"safetensors",
"sentencepiece",
"tiktoken",
"einops",
"scipy",
"numpy",
"tqdm",
]
uv安装
uv pip install -r pyproject.toml
3. 基于Transformers库的推理代码(正常非量化版Qwen3.5-27B)
# qwen3.5_inference.py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# -------------------- 配置部分 --------------------
# 请修改为你的模型本地路径
model_path = "/Users/你的用户名/models/Qwen3.5-27B"
# 检测可用设备(优先使用 MPS,否则 CPU)
if torch.backends.mps.is_available():
device = "mps"
print("✅ 使用 MPS (Metal) 加速")
else:
device = "cpu"
print("ℹ️ 使用 CPU 运行(如需加速请确保 Mac 为 Apple Silicon 且 PyTorch 版本支持 MPS)")
# -------------------------------------------------
print("正在加载分词器...")
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True, # Qwen 需要开启
padding_side="left" # 因果语言模型通常 left padding
)
print("正在加载模型,首次加载可能需要几分钟...")
model = AutoModelForCausalLM.from_pretrained(
model_path,
trust_remote_code=True,
torch_dtype=torch.float16, # 使用半精度减少显存占用,也可修改为bf16形式,以进一步减少显存
device_map=device, # 自动分配到检测到的设备
low_cpu_mem_usage=True
)
# 构造对话(Qwen3.5 的官方模板)
messages = [
{"role": "system", "content": "你是一个乐于助人的助手。"},
{"role": "user", "content": "介绍一下你自己。"}
]
# 使用聊天模板将消息转换成模型输入格式
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True # 添加生成提示符(如 <|im_start|>assistant)
)
print("\n用户输入:", messages[-1]["content"])
print("模型回答:", end="")
# 编码输入
inputs = tokenizer(text, return_tensors="pt").to(device)
# 生成回复
with torch.no_grad():
outputs = model.generate(
inputs.input_ids,
max_new_tokens=512, # 最多生成 512 个新 token
do_sample=True, # 启用采样以增加多样性
temperature=0.7,
top_p=0.9,
repetition_penalty=1.05, # 轻微防止重复
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id
)
# 提取生成的回答部分(去除输入 prompt)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True)
print(response)
4. 若采用GPTQ-INT4量化版推理(先说结果:🙅不行)
4.1 环境需要补充相关库
需要补充:gptqmodel、optimum(optimum ≥ 1.20.0)
通过uv进行安装即可
uv pip install gptqmodel optimum
建议继续补充安装这几个库
uv pip install datasets protobuf
[!CAUTION]
该地方容易踩的坑:
macOS 上 GPTQ 的重大限制,很多人会安装auto-gptq,而它的核心算子是 CUDA kernel
auto-gptq库,其核心的 4-bit 量化推理加速算子(kernel)主要是为 NVIDIA GPU 的 CUDA 编写的。在 macOS(特别是 Apple Silicon 芯片)上,即使能安装成功,也无法利用 GPU (MPS) 获得加速,甚至可能因为找不到 CUDA 而直接报错。有一个更好的替代方案:
gptqmodel(曾用名auto-gptq的继任者)。这个库专门解决了跨平台问题,对 macOS 有非常好的原生支持。根据其官方信息,
gptqmodel明确支持:
- 硬件加速:支持 Apple Silicon 的 MPS (Metal Performance Shaders) 后端,这意味着你的 Mac GPU 可以真正派上用场。
- CPU 回退:如果 MPS 不可用,它也有为 CPU 优化的内核(HF Kernel),支持 Intel 和 Apple Silicon 的 CPU 加速指令集(如 AMX, AVX2)。
- 无缝集成:它完美集成了 Hugging Face 的
transformers库,所以你之前写的推理代码风格完全不用变。简单来说,
gptqmodel就是auto-gptq的升级版,专门解决了你担心的跨平台问题。auto-gptq主要面向 NVIDIA GPU,而gptqmodel则是一个更通用、对 Mac 更友好的选择。
为确保gptqmodel 是否安装成功,可以在终端运行以下代码来进行判断:
python -c “import torch; import gptqmodel; print(‘MPS Available:’, torch.backends.mps.is_available()); print(‘gptqmodel version:’, gptqmodel.version)”
4.2 推理代码是否需要修改
只需要修改模型路径即可,其他不需要修改
4.3 实际测试结果反馈(macos架构无法支持gptq量化方式,加载还是按照原模型大小加载,还是需要50GB内存空间)
[!WARNING]
GPTQ 量化在 Mac(MPS)环境基本不会真正生效,所以 PyTorch 仍然按接近 FP16 大模型 的方式加载权重,从而尝试分配几十 GB 内存。
5. 采用Apple自研的MLX大模型推理框架进行推理
5.1 基于原模型进行MLX转换并量化为4bit
(1)补充相关库
uv pip install mlx mlx-lm huggingface_hub
建议版本
mlx >= 0.18
mlx-lm >= 0.18
建议mlx-lm≥0.25.2
(2)确认MLX是否能够使用Apple GPU
import mlx.core as mx
print(mx.default_device())
正常输出:gpu,则证明成功
(3)MLX转换权重
MLX 官方提供工具:
mlx_lm.convert
假设你的原始权重路径:
/models/Qwen3.5-27B
运行:
python -m mlx_lm.convert \
--hf-path /models/Qwen3.5-27B \
--mlx-path ./qwen35_mlx
转换后目录:
qwen35_mlx/
├── config.json
├── tokenizer.json
├── tokenizer.model
├── weights.npz
这个过程只是:
HF格式 → MLX格式
不会量化。
(4)MLX 4bit量化
MLX 官方量化命令:
python -m mlx_lm.quantize \
--model ./qwen35_mlx \
--bits 4 \
--output ./qwen35_mlx_4bit
参数说明:
| 参数 | 含义 |
|---|---|
--model |
MLX模型目录 |
--bits 4 |
4bit量化 |
--output |
输出目录 |
量化完成后:
qwen35_mlx_4bit/
├── config.json
├── tokenizer.json
├── tokenizer.model
├── weights.npz
权重转化+量化代码
import mlx_lm
mlx_lm.convert(
hf_path="/Volumes/LK/LLM相关试验/transformer_infer_test/model/Qwen/Qwen3.5-27B",
mlx_path="/Volumes/LK/LLM相关试验/transformer_infer_test/model/mlx-community/Qwen3.5-27B-MLX-4bit",
quantize=True,
q_bits=4,
q_group_size=128,
)
print("hf->mlx,并量化转换完成!")
(5)基于MLX框架的推理验证
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler
model_path = "/Volumes/LK/LLM相关试验/transformer_infer_test/model/mlx-community/Qwen3.5-27B-MLX-4bit"
print("Loading model...")
model, tokenizer = load(model_path)
prompt = "介绍一下机器学习和深度学习的主要区别。请用中文回答。"
messages = [{"role": "user", "content": prompt}]
formatted_prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 注意这里
sampler = make_sampler(
temp=0.7,
top_p=0.9
)
print("Assistant:")
generate(
model,
tokenizer,
prompt=formatted_prompt,
sampler=sampler,
max_tokens=1024,
verbose=True
)
5.2 直接从mlx-community社区中下载预转换的MLX 4-bit模型
from mlx_lm import load, generate
# 只需要修改这里的路径/模型名
model_path = "mlx-community/Qwen3.5-27B-Instruct-4bit" # 或者本地路径
print("正在加载模型...")
model, tokenizer = load(model_path)
# 准备对话(使用聊天模板)
messages = [
{"role": "system", "content": "你是一个乐于助人的助手。"},
{"role": "user", "content": "介绍一下机器学习和深度学习的主要区别。"}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True,
)
print("生成回答中...")
response = generate(model, tokenizer, prompt=text, verbose=True, max_tokens=512)
更多推荐

所有评论(0)