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)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐