进阶 lmql.ai 2026-10-11 18:10:44 · 30 阅读

第16章 本地模型 / Transformers

本地模型 / Transformers

LMQL 采用双进程架构:推理进程(长期运行)负责加载模型并提供推理 API,解释器进程(短期运行)负责执行你的 LMQL 程序。这种架构对本地托管的模型很有优势,因为模型加载时间可能很长,或者客户端机器上甚至可能没有所需的 GPU 硬件。本章先介绍如何使用双进程推理 API,然后介绍另一种方案——进程内模型加载(In-Process Model Loading),它可以在同一架构下省去单独的服务器进程。

前置条件

使用本地模型之前,请确保已通过 pip install lmql[hf] 安装 LMQL,这样才会装上运行本地模型所需的依赖。llama.cpp 也同样有此要求,因为 LMQL 的分词仍依赖 HuggingFace transformers。

然后,启动一个 LMQL 推理服务器,比如加载 gpt2-medium 模型,运行以下命令即可:

bash lmql serve-model gpt2-medium --cuda

--cuda 表示在 GPU 上加载模型(如果有的话)。如果有多个 GPU,模型会分布到所有 GPU 上。想用 CPU 推理,去掉 --cuda 即可。如果只想用某个特定 GPU,可以设置 CUDA_VISIBLE_DEVICES 环境变量,例如 CUDA_VISIBLE_DEVICES=0 lmql serve-model gpt2-medium。

默认情况下,模型会通过 8080 端口对外提供 LMQL/LMTP 推理 API。如果模型部署在远程服务器上,记得把该端口隧道/转发到你的客户端机器。之后在 playground 或命令行中执行 LMQL 查询时,只需指定模型名(如 gpt2-medium),运行时就会自动连接 8080 端口上的模型服务器来获取模型生成的文本。

配置

端点与端口:模型默认通过 8080 端口提供服务。要修改端口,可以使用 lmql serve-model 命令的 --port 选项。客户端要连接运行在其他端口上的模型服务器时,可以在构造 lmql.model 对象时指定端口:

lmql.model("gpt2", endpoint="localhost:9999")

模型配置:要使用自定义量化偏好或其他 Transformers 参数来加载模型,可以在运行 lmql serve-model 命令时附加参数。这些参数会直接传给底层的 AutoModelForCausalLM.from_pretrained(...) 函数,具体可参考 Transformers 文档。

例如,要将 from_pretrained 函数的 trust_remote_code 设为 True,运行:

bash lmql serve-model gpt2-medium --cuda --port 9999 --trust_remote_code True

你也可以直接在 Python 环境中启动模型服务,运行 lmql.serve("gpt2-medium", cuda=True, port=9999, trust_remote_code=True)。与命令行一样,标准的 transformers 参数都会透传给 AutoModel.from_pretrained 函数。

进程内模型

如果不想单独运行 lmql serve-model 命令,而是希望在进程内直接加载模型,可以在模型名中使用 local: 前缀来实例化 lmql.model 对象。例如,在进程内加载 gpt2-medium 模型:

python argmax "Hello[WHO]" from lmql.model("local:gpt2")

但要注意,每次重启 LMQL 进程都会重新加载模型,这可能带来较大的开销。

如果需要对模型加载和配置有更多控制,可以给 lmql.model(...) 传入额外参数,例如:

python lmql.model("local:gpt2", cuda=True)

评论 (0)