H3-Image的Prompt Upsampler可独立部署为轻量级服务:需确认prompt_upsampler目录含完整config.json、model.safetensors、tokenizer及processor;验证tokenizer可加载;用transformers加载模型并测试单次推理;再封装为FastAPI服务(workers=1);支持4-bit量化等显存优化。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你想把 H3-Image 内置的 Prompt Upsampler(基于 Qwen3.5-9B)从完整管线中剥离出来,单独部署成一个轻量级提示词生成服务,用于批量预处理、A/B 测试扩写效果或接入自有工作流,而不是每次调用图像生成时被动触发。
确认模型独立性与依赖关系
进入官方仓库的 prompt_upsampler/ 目录,检查是否存在完整的 config.json 和 model.safetensors(或 model.safetensors.index.json)。该目录必须包含 tokenizer、processor 及推理所需全部权重分片——【缺少 processor 或 tokenizer 会导致文本无法分词,直接报错】。
运行 python -c "from transformers import AutoTokenizer; t = AutoTokenizer.from_pretrained('./prompt_upsampler'); print(t.name_or_path)" 验证 tokenizer 可加载。若报错 ModuleNotFoundError,则需手动下载对应 Qwen3.5 分词器并 symlink 到该目录。
使用 Transformers 原生方式加载
创建 upsampler_server.py,写入以下最小启动代码:
```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
import torch
model = AutoModelForSeq2SeqLM.from_pretrained(
"./prompt_upsampler",
torch_dtype=torch.bfloat16,
 >device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("./prompt_upsampler")
def expand(prompt: str, aspect_ratio: str = "1:1") -> str:
input_text = f"Aspect ratio: {aspect_ratio}\nRequest: {prompt}"
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=256, do_sample=False)
return tokenizer.decode(output_ids[0], skip_special_tokens=True).strip()
```
这一步不启动 API,只验证模型能否完成单次推理。执行 python upsampler_server.py,若无 CUDA OOM 且返回合理扩写结果(如输入“咖啡馆窗边”,输出含“浅焦镜头、木质桌椅、晨光斜射、拿铁拉花特写”等细节),说明加载成功。
封装为 FastAPI 接口服务
安装依赖:pip install fastapi uvicorn transformers accelerate。
在原脚本末尾追加:
```python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.post("/expand")
def api_expand(request: dict):
prompt = request.get("prompt", "")
aspect_ratio = request.get("aspect_ratio", "1:1")
if not prompt.strip():
return {"error": "prompt is required"}
expanded = expand(prompt, aspect_ratio)
return {"expanded_prompt": expanded}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0:8000", workers=1)
```
注意:不要设 workers > 1,Qwen3.5-9B 模型在多进程下会因共享 GPU 显存引发竞争错误;【必须保持 workers=1,否则首次请求后所有后续请求均卡死】。
启动服务:python upsampler_server.py。用 curl 测试:curl -X POST http://localhost:8000/expand -H "Content-Type: application/json" -d '{"prompt":"雪山湖泊","aspect_ratio":"16:9"}',返回 JSON 中的 expanded_prompt 即为扩写结果。
优化显存占用(可选)
方法一:启用 4-bit 量化
将模型加载行替换为:model = AutoModelForSeq2SeqLM.from_pretrained("./prompt_upsampler", load_in_4bit=True, device_map="auto")。
此操作可将显存占用从 ~18 GB(bf16)压至约 6.2 GB,但首次生成延迟增加 1.8 秒左右。
方法二:关闭 KV Cache 动态分配
在 model.generate() 调用中加入参数 use_cache=False,可避免长 prompt 下显存峰值突增,适合处理超长原始请求(如带多图描述的编辑指令)。
方法三:限制最大 batch size
当前脚本仅支持单条请求。如需并发,须改用 pipeline(..., batch_size=1) 并配合异步队列,但会显著增加工程复杂度——普通用途无需改动。











