Xinference 中使用 SenseNova-U1.5-8B-MoT 进行文生图与图像编辑的实战指南
【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference
SenseNova-U1.5-8B-MoT 是 Xinference 内置支持的统一多模态图像模型,同时具备文生图(text2image)与图像编辑(image2image)两种能力。本文基于 Xinference 仓库内该模型的官方文档(sensenova-u1.5-8b-mot.rst)与对应源码实现,完整介绍如何通过xinference launch一行命令启动模型,并通过 OpenAI 兼容的/v1/images/generations与/v1/images/edits接口完成高质量图像生成与多参考图编辑,同时深入解析底层生成参数、尺寸约束与引擎调度原理。
模型基本档案
SenseNova-U1.5-8B-MoT 在 Xinference 内置模型目录中的注册信息如下:
- Model Name(模型名):
SenseNova-U1.5-8B-MoT - Model Family(模型族):
sensenova_u1 - Abilities(能力):
text2image(文生图)、image2image(图像编辑) - Available ControlNet(可用 ControlNet):无
- Model ID(模型标识):
sensenova/SenseNova-U1.5-8B-MoT
以上信息完整记录在 Xinference 的图片内置模型规格文件 model_spec.json 中。该文件对模型的定位做了更详细的描述:SenseNova-U1.5-8B-MoT 是一个原生统一多模态模型,专注于高质量文生图以及单参考、多参考图编辑,在文本与布局渲染、复杂指令遵循、视觉控制以及原生 4K 分辨率生成方面表现更强(此描述来自仓库内置模型规格,非性能断言)。
从模型源的配置看,该模型同时登记了 HuggingFace 与 ModelScope 两个下载源:
| 源 | Model ID | Revision |
|---|---|---|
| HuggingFace | sensenova/SenseNova-U1.5-8B-MoT | main |
| ModelScope | SenseNova/SenseNova-U1.5-8B-MoT | master |
启动时 Xinference 会自动从可用源下载权重,无需手工指定下载地址。
一键启动模型
按照官方文档给出的方式,只需执行下面这条命令即可启动该模型:
xinference launch --model-name SenseNova-U1.5-8B-MoT --model-type image其中--model-name指定内置模型名,--model-type image表明这是一个图像类模型,Xinference 会自动将其路由到 image 类型的能力通道。启动完成后,可以通过xinference list查看已加载模型及其自动生成的model_uid,后续所有 API 调用都需要使用该model_uid作为请求中的model字段。
除了命令行,还可以使用 Python RESTful 客户端以编程方式启动,对应接口为 restful_client.py 中的launch_model:
from xinference.client import Client client = Client("http://localhost:9997") model_uid = client.launch_model( model_name="SenseNova-U1.5-8B-MoT", model_type="image", ) print(model_uid)launch_model支持的常用参数还包括model_uid(自定义实例标识)、n_gpu(默认"auto",None表示纯 CPU)、gpu_idx(指定 GPU 序号)以及model_path(本地权重路径,便于离线部署)等。
默认加载与生成配置
在模型启动阶段,Xinference 会根据model_spec.json中的default_model_config自动套用默认加载参数:
"default_model_config": { "torch_dtype": "bfloat16", "device_map": "auto" }即默认以bfloat16精度加载权重,并由accelerate自动分配设备映射。同时内置的默认生成配置为:
"default_generate_config": { "cfg_scale": 4.0, "cfg_norm": "none", "timestep_shift": 3.0, "num_steps": 50 }cfg_scale:无分类器引导强度(CFG),默认4.0,数值越高越贴近提示词、多样性越低;cfg_norm:CFG 归一化策略,默认none;timestep_shift:时间步偏移量,默认3.0,影响采样轨迹对高噪声阶段的侧重;num_steps:采样步数,默认50。
这些默认值在使用 API 时若未显式指定,会被自动合并进生成请求(见下文"生成参数"一节)。
调用文生图接口
Xinference 提供与 OpenAI 兼容的POST /v1/images/generations接口,路由注册位于 images.py。请求体对应 requests.py 中的TextToImageRequest:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model | str | 必填 | 已启动模型的model_uid |
prompt | str / list | 必填 | 生成提示词 |
n | int | 1 | 一次生成的图片数量 |
size | str | "1024*1024" | 输出尺寸,格式宽*高 |
response_format | str | "url" | 返回形式,url或b64_json |
kwargs | str | null | JSON 字符串形式的扩展生成参数 |
user | str | null | 用户标识 |
使用curl的调用示例:
curl http://localhost:9997/v1/images/generations \ -H "Content-Type: application/json" \ -d '{ "model": "sensenova-u1.5-8b-mot", "prompt": "a serene mountain lake at sunrise, ultra detailed", "size": "1024*1024", "n": 1, "response_format": "url", "kwargs": "{\"cfg_scale\": 4.0, \"num_steps\": 50, \"seed\": 42}" }'返回结构为ImageList(定义于 types.py),包含created时间戳与data数组,每个元素是{"url": ...}或{"b64_json": ...}。
服务端处理入口是 restful_api.py 的create_images:它先解析请求体,通过require_model校验模型已就绪,再将kwargs从 JSON 字符串反序列化,最终调用模型的text_to_image方法并把结果以 JSON 响应返回。
调用图像编辑接口
图像编辑能力通过POST /v1/images/edits暴露(路由见 images.py),其请求结构对应 types.py 中的ImageEditRequest,属于 multipart/form-data 形式:
| 字段 | 类型 | 说明 |
|---|---|---|
image | str / bytes / list | 输入图片,支持 URL、base64 或二进制文件,可传多张 |
prompt | str | 编辑指令提示词(必填) |
n | int | 输出图片数量 |
size | str | 输出尺寸,"1024*1024"形式,或"original"保持输入比例 |
response_format | str | url或b64_json |
mask | str / bytes | 可选遮罩 |
示例:
curl http://localhost:9997/v1/images/edits \ -F "model=sensenova-u1.5-8b-mot" \ -F "image=@input.png" \ -F "prompt=change the background into a starry night" \ -F "size=1024*1024"也可以在同一请求中传入多张输入图作为多参考图,实现"以多张图片为参照进行编辑"的效果。此外,通过扩展参数reference_images可以传入额外的参考图列表(见下文源码解析)。
生成参数详解:从源码看支持的选项
Xinference 对 SenseNova-U1 的生成参数做了白名单过滤,只有被底层模型支持的参数才会真正下传给生成引擎,其余参数会被忽略并打日志警告。过滤逻辑实现在 sensenova_u1.py 的_filter_generate_config中,文生图与图生图均支持的参数包括:
| 参数 | 说明 |
|---|---|
cfg_scale | CFG 引导强度,默认4.0 |
cfg_norm | CFG 归一化方式,默认none |
timestep_shift | 时间步偏移,默认3.0 |
enable_timestep_shift | 是否启用时间步偏移 |
cfg_interval | CFG 作用区间(元组),可只在部分采样步应用 CFG |
num_steps | 采样步数,默认50 |
method | 采样方法(solver 选择) |
t_eps | 采样终止时间阈值 |
think_mode | 思考模式开关,开启后生成会返回特定结构的输出 |
seed | 随机种子,-1或None表示随机 |
在图像编辑(image_to_image)场景下还会额外支持img_cfg_scale(图生图的 CFG 强度)。
此外,源码中的_get_generate_config(sensenova_u1.py)还做了两类参数别名归一化:
- 传入
guidance_scale会被转换为cfg_scale,传入num_inference_steps会被转换为num_steps(diffusers风格命名的参数在这里同样可用); negative_prompt、denoising_strength等扩散模型常见参数对 SenseNova-U1 不适用,会被主动剔除;- 当
seed为None或-1时,会调用random.randint(0, 2**31 - 1)生成随机种子。这一行为由测试用例 test_sensenova_u1.py 直接验证:test_generate_config_randomizes_default_seed断言空 kwargs、seed=None、seed=-1三种情况下都会得到随机化种子,而test_generate_config_preserves_non_negative_seed则保证显式传入的非负种子原样保留,从而支持可复现生成。
底层实现原理:源码级剖析
模型类与引擎路由
SenseNova-U1.5-8B-MoT 的运行时实现是 sensenova_u1.py 中的SenseNovaU1Model,它继承自SDAPIDiffusionModelMixin(SD WebUI 兼容层,定义于 sdapi.py),因此该模型同样兼容/sdapi/v1/txt2img等 SD WebUI 风格接口。
引擎路由逻辑位于 engine.py:TransformersSenseNovaU1ImageModel将模型族sensenova_u1绑定到transformers引擎(engine_model_format = "pytorch",required_libs = ("torch", "transformers"))。加载时 load() 会把仓库内的thirdparty/sensenova_u1目录加入sys.path并导入sensenova_u1工具包,进而调用load_model_and_tokenizer完成权重加载。
尺寸约束与像素控制
源码中定义了严格的输出尺寸规则(sensenova_u1.py):宽度和高度都必须是 32 的倍数(_IMAGE_GRID_FACTOR = 32),否则抛出ValueError。默认文生图尺寸为"1024*1024"。
在图像编辑路径(image_to_image)中,输入图会先统一转换为 RGB 模式,RGBA 图片会以白色背景合成(_convert_to_rgb)。三个像素相关参数值得关注:
input_max_pixels:默认"auto",即输入图总像素上限为2048*2048;当输入图片多于 2 张时,会自动按2 * 2048 * 2048 // num_images动态下调上限(最小值512*512),避免多参考图场景下显存失控;target_pixels:默认2048*2048,当输出尺寸设为"original"时,会以输入图长宽比和target_pixels为依据,通过smart_resize自动计算适配的输出尺寸;do_resize:是否对输入图执行智能缩放,默认True。
缩放过程中会复用sensenova_u1.models.neo_unify.utils.smart_resize,以 32 为对齐因子,并使用 LANCZOS 重采样保证质量。
LoRA 与加载选项
该模型支持加载图像 LoRA 权重:若通过peft_model_config传入lora_list,加载阶段会对每个 LoRA 调用load_and_merge_lora_weight_from_safetensors将其合并进基础模型(sensenova_u1.py);同时它会忽略image_lora_load_kwargs/image_lora_fuse_kwargs并给出警告,说明 SenseNova-U1 只支持直接合并式 LoRA。
加载阶段可接受的 kwargs 还包括torch_dtype(默认bfloat16,接受"bfloat16"这类字符串写法)、attn_backend(默认"auto")、vram_mode(控制显存驻留与预取策略)、device_map、max_memory以及fast_vram_fraction/fast_vram_headroom_gib/fast_activation_reserve_gib/fast_vram_budget_gib等显存控制参数。注意:该模型不支持 lightning 模型格式,传入lightning_model_path会直接报错(sensenova_u1.py)。
推理执行流程
- 文生图:在
torch.inference_mode()与_offload_context()上下文中调用底层model.t2i_generate(tokenizer, prompt, image_size, batch_size, ...); - 图像编辑:调用
model.it2i_generate(tokenizer, prompt, images, image_size, batch_size, ...)。
当通过seed列表方式指定多个种子时(resolve_image_seed_list,实现于 utils.py),会逐种子以batch_size=1循环生成以保证每张图片可复现;think_mode开启时则从输出中取output[0]作为最终结果。生成的张量会经_to_pil(先(x*0.5+0.5)反归一化、再转 uint8)还原为 PIL 图片,最终由handle_image_result按response_format输出为 URL 或 base64。
虚拟环境依赖
从model_spec.json的virtualenv.packages配置看,启动该模型时会自动创建独立虚拟环境并安装以下依赖(在transformers引擎下生效):
transformers>=4.57.1,<6accelerate>=1.1,<2huggingface-hub>=0.34,<2safetensors>=0.4.3,<1sentencepiece==0.2.1- 系统 torch、torchvision、numpy(跟随运行环境版本)
Xinference 的虚拟环境机制会自动完成这些包的安装,因此首次启动需要等待依赖就绪与权重下载;如需离线部署,可参考仓库中--model-path(本地权重目录)配合虚拟环境的相关文档使用。
小结
SenseNova-U1.5-8B-MoT 在 Xinference 中以"一行命令启动、OpenAI 兼容接口调用"的方式集成了文生图与图像编辑两大能力:
- 启动只需
xinference launch --model-name SenseNova-U1.5-8B-MoT --model-type image; - 文生图走
POST /v1/images/generations,图像编辑走POST /v1/images/edits,请求参数与 OpenAI Images API 对齐; - 输出尺寸必须为 32 的倍数,编辑场景支持多参考图、
input_max_pixels自动适配与 4K 级target_pixels输出; - 底层由
transformers引擎承载,支持 LoRA 合并、vram_mode显存优化与 SD WebUI 兼容接口。
如需深入了解实现细节,可继续阅读上述引用的源码文件:模型规格 model_spec.json、核心实现 sensenova_u1.py、引擎路由 engine.py 以及单元测试 test_sensenova_u1.py。
【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考