02 SDXL:环境安装、模型下载与图片生成实战 ARM + Ubuntu 24 + RTX 4090
ARM + Ubuntu 24 + RTX 4090 本地部署 SDXL:环境安装、模型下载与图片生成实战
一、前言
最近在搭一套本地 AI 视频生成流水线,整体思路是:
- 先用 SDXL 生成分镜图、角色图、关键帧
- 再接视频模型做图生视频
- 最后拼成完整内容
因此,第一步就是先把 图片生成环境 跑通。
本文主要记录一次在 ARM 架构服务器 + Ubuntu 24 + RTX 4090 环境下,本地部署 SDXL 并完成测试出图的全过程。
目标不是一开始就追求最佳画质,而是:
先把环境跑通,先把结果产出来
目前结论是:
- 环境已成功搭建
- 本地模型能够加载
- CUDA 推理正常
- 图片可以生成
- 但生成效果还有进一步优化空间
如果你也在做本地部署、小说分镜、图生视频或者批量内容生产,这篇文章应该会有参考价值。
二、环境说明
本文测试环境如下:
- CPU:ARM 架构(飞腾 S5000C)
- 系统:Ubuntu 24
- GPU:NVIDIA GeForce RTX 4090 D
- Python:3.10
- 环境管理:conda
在这种环境下,最关键的一步其实不是先装 SDXL,而是先确认:
- PyTorch 能否正常安装
- CUDA 是否可用
- GPU 张量运算是否正常
这部分我已经提前验证通过,所以本文直接进入 SDXL 图片生成环境 的安装与测试。
三、安装 SDXL 依赖环境
先进入 conda 环境:
conda activate aq_py310
然后安装图片生成所需依赖:
python -m pip install numpy pillow safetensors accelerate transformers diffusers huggingface_hub sentencepiece protobuf -i https://mirrors.aliyun.com/pypi/simple/
这批依赖包含了:
diffusers:模型推理主库transformers:文本编码相关safetensors:安全权重格式支持accelerate:推理加速辅助huggingface_hub:模型下载numpy / pillow:图片处理基础依赖
四、测试 Hugging Face 镜像是否可用
由于直接访问 Hugging Face 官方站点速度通常比较慢,所以这里使用镜像入口进行测试。
先用下面代码检查镜像连通性:
from huggingface_hub import hf_hub_download
print("start")
path = hf_hub_download(
repo_id="stabilityai/stable-diffusion-xl-base-1.0",
filename="model_index.json",
endpoint="https://hf-mirror.com",
)
print("done:", path)
如果能正常输出文件路径,说明镜像入口是可用的,可以继续下载模型。
五、SDXL 模型下载:不建议直接全量拉取
1. 全量下载方式
理论上可以直接通过下面代码把整个仓库下载下来:
from huggingface_hub import snapshot_download
local_dir = "/work/models/stable-diffusion-xl-base-1.0"
print("Start downloading SDXL model...")
path = snapshot_download(
repo_id="stabilityai/stable-diffusion-xl-base-1.0",
local_dir=local_dir,
local_dir_use_symlinks=False,
resume_download=True,
endpoint="https://hf-mirror.com",
)
print("Download finished.")
print("Saved to:", path)
2. 为什么不推荐全量下载
实测全量下载体积非常大,耗时长,而且在网络不稳定时容易反复中断和重试。
如果只是为了本地推理验证,完全没必要把整个仓库所有文件都拉下来。
所以更推荐的方式是:
只下载推理必需文件
六、推荐方案:最小集合下载
下面这段代码会只下载 SDXL 推理所需的关键目录,并过滤掉不必要的大文件格式:
from huggingface_hub import snapshot_download
local_dir = "/work/models/sdxl-base-diffusers"
print("Start downloading minimal SDXL model...")
path = snapshot_download(
repo_id="stabilityai/stable-diffusion-xl-base-1.0",
local_dir=local_dir,
endpoint="https://hf-mirror.com",
allow_patterns=[
"model_index.json",
"scheduler/*",
"text_encoder/*",
"text_encoder_2/*",
"tokenizer/*",
"tokenizer_2/*",
"unet/*",
"vae/*",
],
ignore_patterns=[
"*.bin",
"*.onnx",
"*.msgpack",
"*.h5",
],
)
print("Download finished.")
print("Saved to:", path)
这种方式的优点很明显:
- 下载体积小很多
- 更适合本地推理
- 不容易因为全量下载而浪费时间
- 更适合部署在服务器上
下载完成后,本地目录结构类似:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
如果这些目录都存在,说明模型目录已经具备本地加载条件。
其实本人最后因为网络的缘故,是下载了最小集合(在windows下下载的),压缩之后使用网盘下载到服务器的,实在是无奈
七、编写本地测试脚本
下面是一份固定参数版本的测试脚本,用来快速验证:
- 本地模型是否能成功加载
- CUDA 是否能参与推理
- 是否可以正常生成图片
import os
import time
import torch
from diffusers import StableDiffusionXLPipeline
# =========================
# 固定参数区
# =========================
MODEL_DIR = "/work/models/sdxl-base-diffusers"
OUTPUT_PATH = "../03-output/generated_image.png"
PROMPT = "一名年轻的东方玄幻少年,黑色长发,青色长袍,跪在宏伟的宗门大殿中央,四周长老高坐,神情冷漠,气氛压抑,电影感光影,精致插画风,高细节"
NEGATIVE_PROMPT = "模糊,低质量,畸形手,多手指,多肢体,脸部畸形,身体扭曲,水印,文字"
WIDTH = 768
HEIGHT = 768
STEPS = 20
GUIDANCE_SCALE = 7.5
SEED = 42
DEVICE = "cuda"
def main():
print("[1/5] Loading pipeline from local model directory...", flush=True)
t0 = time.time()
pipe = StableDiffusionXLPipeline.from_pretrained(
MODEL_DIR,
torch_dtype=torch.float16,
use_safetensors=True,
local_files_only=True,
)
print(f"[2/5] Pipeline loaded in {time.time() - t0:.2f}s", flush=True)
print("[3/5] Moving pipeline to CUDA...", flush=True)
pipe = pipe.to(DEVICE)
pipe.enable_attention_slicing()
pipe.enable_vae_slicing()
print("[4/5] Generating image...", flush=True)
generator = torch.Generator(device=DEVICE).manual_seed(SEED)
t1 = time.time()
result = pipe(
prompt=PROMPT,
negative_prompt=NEGATIVE_PROMPT,
width=WIDTH,
height=HEIGHT,
num_inference_steps=STEPS,
guidance_scale=GUIDANCE_SCALE,
generator=generator,
)
image = result.images[0]
print(f"[5/5] Image generated in {time.time() - t1:.2f}s", flush=True)
os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
image.save(OUTPUT_PATH)
print(f"Saved to: {OUTPUT_PATH}", flush=True)
if __name__ == "__main__":
main()
八、运行方式
执行命令:
CUDA_VISIBLE_DEVICES=0 python test_sdxl.py
其中:
CUDA_VISIBLE_DEVICES=0:指定使用第 0 张显卡test_sdxl.py:你保存的测试脚本文件名
运行成功后,图片会输出到:
../03-output/generated_image.png

默认生成的感觉有点莫名其妙,反正目前先能用就行
九、测试结果
从结果来看,这套环境已经可以完成:
- 本地模型加载
- 文本编码
- GPU 推理
- 图片生成
- 图片保存
十、当前存在的问题
虽然目前已经可以正常生成图片,但从实际效果看,仍然存在比较明显的问题:
1. 提示词理解不够稳定
输入的是带场景、带叙事的描述,但输出结果有时会偏成人物特写或风格跑偏。
2. 构图控制较弱
模型很容易优先生成“好看的人物头像”或半身像,而不是严格按照分镜式场景描述来出图。
3. 小说分镜提示词不够精确
如果直接写“文学化描述”,模型容易抓住“人物形象”而忽略“镜头语言”和“场景构图”。
十一、为什么图片效果还不理想?
这一步其实很正常。
因为现在只是完成了:
环境验证 + 基础出图
并没有完成真正的“效果调优”。
影响图片质量的因素还包括:
- Prompt 写法
- Negative Prompt 写法
- 分辨率
- 推理步数
- guidance scale
- seed
- 模型风格偏好
- 是否引入 LoRA / ControlNet / IP-Adapter 等控制模块
十二、后续优化方向
接下来建议重点从以下几个方向继续优化。
1. 优化 Prompt 结构
后续提示词不要再偏“小说文案”,而要偏“镜头指令”。
例如优先描述:
- 远景 / 中景 / 特写
- 人物位置
- 场景主体
- 镜头类型
- 风格与光影
2. 增强 Negative Prompt
不仅要压制畸形手、低质量,还可以明确排除:
- 人物特写
- 头像构图
- 大头风格
- 现代服装
- 室内背景
3. 调整参数
可以继续尝试:
WIDTH / HEIGHTSTEPSGUIDANCE_SCALESEED
4. 引入控制能力
后续可以继续加入:
- LoRA:固定角色风格
- IP-Adapter:参考人物形象
- ControlNet:控制姿态和构图
5. 为后续视频生成做准备
图片稳定后,可以继续接:
- AnimateDiff
- Stable Video Diffusion
- HunyuanVideo
十三、总结
本文完整记录了在 ARM + Ubuntu 24 + RTX 4090 环境下,本地部署 SDXL 的过程,包括:
- 依赖安装
- Hugging Face 镜像测试
- 模型下载方式对比
- 最小集合下载方案
- 本地模型加载
- 图片生成测试
最终结果证明:
SDXL 本地环境已经成功跑通,可以生成图片。
虽然当前效果还不够理想,但这并不影响它作为后续工作流的基础模块。
对于做小说分镜、图生视频、批量内容生成的人来说,这一步非常关键。
后续如果继续往下做,我会重点优化:
- Prompt 模板
- 场景控制
- 分镜生成效果
- 图片转视频工作流
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)