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 / HEIGHT
  • STEPS
  • GUIDANCE_SCALE
  • SEED

4. 引入控制能力

后续可以继续加入:

  • LoRA:固定角色风格
  • IP-Adapter:参考人物形象
  • ControlNet:控制姿态和构图

5. 为后续视频生成做准备

图片稳定后,可以继续接:

  • AnimateDiff
  • Stable Video Diffusion
  • HunyuanVideo

十三、总结

本文完整记录了在 ARM + Ubuntu 24 + RTX 4090 环境下,本地部署 SDXL 的过程,包括:

  • 依赖安装
  • Hugging Face 镜像测试
  • 模型下载方式对比
  • 最小集合下载方案
  • 本地模型加载
  • 图片生成测试

最终结果证明:

SDXL 本地环境已经成功跑通,可以生成图片。

虽然当前效果还不够理想,但这并不影响它作为后续工作流的基础模块。
对于做小说分镜、图生视频、批量内容生成的人来说,这一步非常关键。

后续如果继续往下做,我会重点优化:

  • Prompt 模板
  • 场景控制
  • 分镜生成效果
  • 图片转视频工作流
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐