欢迎光临
我们一直在努力

MAC上采用Transformers官方库对Qwen3.5-27B模型进行推理

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)
未经允许不得转载:171主机测评 » MAC上采用Transformers官方库对Qwen3.5-27B模型进行推理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址