如何在 reComputer 上运行本地 LLM 文本生成图像
本文档由 AI 翻译。如您发现内容有误或有改进建议,欢迎通过页面下方的评论区,或在以下 Issue 页面中告诉我们:https://github.com/Seeed-Studio/wiki-documents/issues
简介
文本生成图像模型是一种人工智能(AI)模型,可以根据文本描述生成图像。这些模型接受文本输入,例如描述场景的句子或段落,并基于这些描述生成图像。
这些模型通过在包含文本描述和对应图像的大型数据集上进行训练,学习文本和视觉信息之间的关系。
近年来,文本生成图像模型取得了显著进展,但生成高质量、多样化且准确匹配文本描述的图像仍然是 AI 研究中的一项挑战性任务。
概述
在本教程中,我们将探索几种部署和运行本地 LLM 文本生成图像的方法:
- 创建虚拟环境(支持 TensorFlow 和 PyTorch)
- 1.1 使用 Keras Stable Diffusion 创建示例
- 1.2 使用 Hugging Face 提供的模型创建示例
- 1.3 创建一个小型 Python API,用于通过调用 API 为 Keras 和 Hugging Face 生成图像
- 使用 Nvidia 容器。
故障排查
在开始之前,这里有一些可以释放更多内存的步骤:
禁用桌面 GUI。我们可以通过 SSH 使用 Jetson,这样可以节省大约 ~800MB 的内存。
禁用 ZRAM 并使用 Swap。
您可以在 Nvidia Jetson AI Lab 中找到这些技巧以及如何实现它们。
要求
在本教程中,我们需要一台 Nvidia Jetson Orin NX 16GB。

我们还需要确保已安装 TensorFlow 和 PyTorch——但我会在这里详细说明。
第 1 步 - 创建虚拟环境
Keras 可以使用 TensorFlow 或 PyTorch 作为后端。Hugging Face 主要使用 PyTorch。
让我们安装 TensorFlow 和 PyTorch。
有关如何为 Jetson Orin NX 安装 TensorFlow 和 PyTorch 的说明,请参阅 Nvidia 网站。
我们可以全局安装 TensorFlow 和 PyTorch,也可以在虚拟环境中安装。我们将使用虚拟环境。
通过使用虚拟环境,我们可以避免项目或包版本之间的冲突。
这是最佳方式,尽管 Nvidia 网站更倾向于全局方法。
TensorFlow
创建虚拟环境(我使用名称 kerasStableEnvironment
,因为我将用它来运行 Keras 示例。如果需要,可以使用其他名称。)
sudo apt install python3.8-venv
python -m venv kerasStableEnvironment
创建完成后,激活虚拟环境:
source kerasStableEnvironment/bin/activate
激活后,您会在提示符前看到虚拟环境的名称:

进入虚拟环境:
cd kerasStableEnvironment
升级 PIP 并安装一些依赖项:
pip install -U pip
pip install -U numpy grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta setuptools testresources
为 Jetpack 5.1.1 安装 TensorFlow:
要查看我们拥有的 JetPack 版本,请运行以下命令:
dpkg -l | grep -i jetpack
结果应显示 JetPack 版本:

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v511 tensorflow==2.12.0+nv23.05
如果您有其他 JetPack 版本,请查看 Nvidia 网站 以获取正确的 URL。
现在,让我们检查 TensorFlow 是否安装成功:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
这应该返回以下内容:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
PyTorch
让我们安装一些依赖项:
sudo apt install libopenblas-dev
现在,为 JetPack 5.1.1 安装 PyTorch:
pip install --no-cache https://developer.download.nvidia.com/compute/redist/jp/v511/pytorch/torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl
检查安装是否成功以及 CUDA 是否可用:
python -c "import torch; print(torch.cuda.is_available())"
它应该返回 True。
现在我们已经安装了 TensorFlow 和 PyTorch,接下来安装 Keras 并创建图像。
1.1 Keras
在安装 PyTorch 和 TensorFlow 后,我们现在可以开始根据文本提示生成图像了。 确保您仍然处于虚拟环境中。
KerasCV 提供了 Stability.ai 文本生成图像模型 Stable Diffusion 的实现(以及其他实现)。
通过使用 KerasCV 的实现,我们可以利用一些性能优势,例如 XLA 编译和混合精度支持。
安装 keras 和相关依赖项。我们选择这些版本是因为它们与我们已安装的 TensorFlow(或 PyTorch)版本兼容。
pip install keras-cv==0.5.1
pip install keras==2.12.0
pip install Pillow
打开你喜欢的编辑器并输入以下示例代码:
vi generate_image.py
import keras_cv
import keras
from PIL import Image
# 设置全局混合精度策略为 "mixed_float16"
keras.mixed_precision.set_global_policy("mixed_float16")
# 初始化 Stable Diffusion 模型
model = keras_cv.models.StableDiffusion (
img_width=512, # 我们可以选择其他尺寸,但必须是 128 的倍数
img_height=512, # 同上
jit_compile=True
)
# 定义生成图像的提示词
prompt = "一只可爱的魔法飞行狗,奇幻艺术,金色,高质量,高度细节化,优雅,清晰聚焦,概念艺术,角色概念,数字绘画,神秘,冒险"
# 使用提示词生成图像
image = model.text_to_image (prompt,
num_steps = 25, # 图像质量
batch_size = 1 # 一次生成的图像数量
)
# 保存生成的图像
Image.fromarray(image[0]).save("keras_generate_image.png")
运行脚本时,这里是一些统计信息:

过了一会儿,生成的结果如下:

第 1.2 步 - Hugging Face
Hugging Face 类似于机器学习领域的 GitHub。它让开发者可以构建、部署、共享和训练他们的机器学习模型。
Hugging Face 还因其 Transformers Python 库而闻名,该库简化了下载和训练机器学习模型的过程。
让我们使用一些可用的模型。 访问 Hugging Face 并选择查看模型。
在左侧,你会看到一些过滤器,可以让我们选择想要查看的模型类型。

有很多可用的模型,但我们将专注于文本到图像模型。
虚拟环境
创建一个虚拟环境,就像我们之前做的那样,这样我们可以使用 Hugging Face 而不会影响其他包的版本或安装不需要的包。
python -m venv huggingfaceTesting
source huggingfaceTesting/bin/activate
创建虚拟环境后,进入该环境。 按照上面的说明安装 PyTorch。
cd huggingfaceTesting
模型
Hugging Face 提供了许多 文本到图像模型。尽管理论上它们应该可以在我们的 Jetson 上运行,但实际上并不行。
stable-diffusion-v1-5
我将测试 Runaway 提供的 stable-diffusion-v1-5。
在模型卡片中,它们提供了使用该模型所需的所有信息。

我们将使用 Hugging Face 的 diffusers 库。 在虚拟环境中(并确保已激活),安装以下依赖项:
pip install diffusers transformers accelerate
现在我们已经安装了所有依赖项,让我们尝试使用该模型。 使用你喜欢的编辑器,复制以下代码(也可以在模型卡片页面中找到):
from diffusers import StableDiffusionPipeline
import torch
# 模型 ID
model_id = "runwayml/stable-diffusion-v1-5"
# 加载模型
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
# 定义提示词
prompt = "一只在星球大战中拿着光剑的绝地大师猫,穿着绝地斗篷,戏剧性、电影感的灯光"
# 生成图像
image = pipe(prompt).images[0]
# 保存图像
image.save("cat_jedi.png")
运行模型:
python stableDiffusion.py
注意: 这需要占用大量空间。模型的检查点文件正在下载。这只会在第一次运行时发生。

过了一会儿,生成的结果如下:

SDXL-Turbo
这里是另一个可以尝试的模型:Stability AI 提供的 SDXL Turbo。 复制以下代码:
from diffusers import AutoPipelineForText2Image
import torch
# 加载模型
pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")
# 定义提示词
prompt = "全身,一只打扮成维京人的猫,手持武器,战斗色彩,发光,高度细节化,超现实主义,电影感"
# 生成图像
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
# 保存图像
image.save("sdxl-turbo.png")
这个提示词来自 Daria Wind 撰写的一篇 Medium 文章
这个模型生成图像非常快。从运行脚本到退出大约需要 30 秒。 生成的结果如下:

我们还可以尝试其他模型,比如专门为动漫或赛博朋克训练的模型。
有些模型可能无法运行。这可能是由于多种因素——内存不足、可用 CPU 数量或交换内存不足等。
第 1.3 步 - 创建一个小型 API
现在让我们使用 Flask 创建一个小型 API,用于根据提示词生成图像并将其返回给调用者。
假设你已经启动了 Jetson,并希望通过调用一个 API 来生成图像——你的个人 LLM 图像到文本服务。
虽然已经有一些项目可以实现这一点(比如我们稍后会看到的项目),但自己动手实现总是更有趣。
创建一个新的虚拟环境
python -m venv imageAPIGenerator
激活虚拟环境并进入
source imageAPIGenerator/bin/activate
cd imageAPIGenerator
我们将使用 Flask 来实现这一功能。Flask 是一个用 Python 编写的 Web 应用框架,它足够轻量,适合我们的需求。
安装 Flask。
pip install Flask
安装完成后,接下来安装我们需要的其他依赖项。为了演示,我们将使用 Keras,因为它的依赖项最少。
安装 TensorFlow。按照上面的说明操作。 接下来,安装 Keras。
pip install keras-cv==0.5.1
pip install keras==2.12.0
pip install Pillow
现在开始编写我们的应用程序。
vi app.py
对于那些不熟悉 Flask 的人,我们先尝试一个简单的示例。
from flask import Flask
app = Flask(__name__)
@app.route("/generate_image")
def generate_image_api():
return "<h2>Hello World !</h2>"
if __name__ == "__main__":
app.run(host='', port=8080)
运行 Python 脚本:
python app.py
你应该会看到以下内容:

现在,打开浏览器并尝试通过 8080 端口访问你的 Jetson 设备。


我们刚刚做了以下操作:
导入 Flask 类
import Flask
接下来创建了 Flask 类的一个实例
app = Flask(__name__)
然后创建了一个路由装饰器,用来告诉 Flask 哪个 URL 会触发我们的函数
@app.route("/generate_image")
当在 URL 中使用 generate_image
时,我们会触发以下函数
def generate_image_api():
return "<h2>Hello World !</h2>"
我们还可以使用 curl 来访问我们的 API
curl http://192.168.2.230:8080/generate_image

现在我们知道如何创建一个 API,接下来深入编写它。
vi app.py
粘贴以下代码:
from flask import Flask, request, send_file
import random, string
import keras_cv
import keras
from PIL import Image
# 定义 APP
app = Flask(__name__)
# Keras 配置选项
keras.mixed_precision.set_global_policy("mixed_float16")
# 生成自定义文件名
def generate_random_string(size):
"""生成指定大小的随机字符串。"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=size))
"""
这是生成图像的函数
并使用随机生成的文件名保存图像
"""
def generate_image(prompt):
model = keras_cv.models.StableDiffusion(
img_width=512, # 我们可以选择其他尺寸,但必须是 128 的倍数
img_height=512, # 同上
jit_compile=True
)
image = model.text_to_image(prompt,
num_steps=25,
batch_size=1
)
# 图像文件名
filename = generate_random_string(10) + ".png"
Image.fromarray(image[0]).save(filename)
return filename # 返回文件名以发送给客户端
# 定义路由
# 使用 GET 方法接收 prompt
@app.route("/generate_image", methods=["GET"])
def generate_image_api():
# 获取 prompt
prompt = request.args.get("prompt")
if not prompt:
# 定义默认的 prompt
prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."
image_name = generate_image(prompt)
return send_file(image_name, mimetype='image/png')
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080)
注意: 这段代码并不适合直接用于互联网。我们没有任何安全措施。
运行代码。
在浏览器中输入 URL http://jetsonIP:8080/generate_image 并等待。
如果没有提供 prompt,它将使用我们设置的默认值。
在 CLI 中,你可以看到图像正在生成:

在浏览器中,稍等片刻后,你可以看到生成的图像:

我们还可以看到图像已被发送:

我们还可以使用 curl 获取图像并保存:

如果我们想提供一个 prompt(这是推荐的做法),URL 将如下所示: http://jetsonIP:8080/generate_image?prompt=<your_prompt>
我们可以扩展这个示例来构建一个更好的页面,比如添加一些文本框供用户输入、一个漂亮的背景等。但这属于另一个项目。
第 2 步 - Nvidia LLM
Stable Diffusion v1.5
我们可以使用 Jetson Containers 项目来运行 stable-diffusion-webui using AUTOMATIC1111。
Jetson Containers 项目由 Dusty Franklin 维护,他是 NVIDIA 的一名员工。
NVIDIA 有一个名为 NVIDIA Jetson Generative AI Lab 的项目,其中包含许多关于机器学习的教程。
我们将使用 Stable Diffusion 教程。
首先克隆 GitHub 仓库,进入仓库并安装依赖项:
git clone https://github.com/dusty-nv/jetson-containers
cd jetson-containers/
sudo apt update; sudo apt install -y python3-pip
pip3 install -r requirements.txt
现在我们已经准备好所有需要的内容,接下来运行带有 stable-diffusion-webui autotag 的容器:
./run.sh $(./autotag stable-diffusion-webui)
它将开始运行容器。
过了一会儿,它会提示有一个兼容的容器,并询问是否继续:
Found compatible container dustynv/stable-diffusion-webui:r35.3.1 (2024-02-02, 7.3GB) - would you like to pull it? [Y/n]
然后开始下载容器。

下载完成后,它会下载模型并在端口 7860 上运行服务器。
在我的情况下,起初并没有成功。无论我点击刷新按钮多少次,都没有出现可供选择的检查点。

我发现我的磁盘空间已经被占满了:
feiticeir0@JetsonOrin:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p1 79G 79G 0 100% /
none 7,4G 0 7,4G 0% /dev
tmpfs 7,6G 0 7,6G 0% /dev/shm
tmpfs 1,6G 19M 1,5G 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 7,6G 0 7,6G 0% /sys/fs/cgroup
/dev/loop0 162M 162M 0 100% /snap/chromium/2797
/dev/loop2 128K 128K 0 100% /snap/bare/5
/dev/loop1 70M 70M 0 100% /snap/core22/1125
/dev/loop3 65M 65M 0 100% /snap/cups/1025
/dev/loop4 92M 92M 0 100% /snap/gtk-common-themes/1535
/dev/loop6 162M 162M 0 100% /snap/chromium/2807
/dev/loop5 483M 483M 0 100% /snap/gnome-42-2204/174
/dev/loop7 35M 35M 0 100% /snap/snapd/21185
tmpfs 1,6G 4,0K 1,6G 1% /run/user/1000
我之前测试了其他模型,它们占用了所有空间。如果你也遇到这种情况,只需进入你的主目录,找到隐藏的缓存目录并删除 Hugging Face 目录:
cd ~/.cache
rm -rf huggingface
现在你应该有可用的空间了。或者,你可以换一个更大的硬盘。:)
现在模型正在下载。


打开浏览器,访问你的 Jetson IP 地址和端口,运行 AUTOMATIC1111 的 Stable Diffusion webgui:
http://JetsonIPAddress:7860

现在我们可以开始玩了。 以下是使用默认模型生成的一些图像:


Stable Diffusion XL
AUTOMATIC1111 支持其他模型。我们来试试 Stable Diffusion XL,它有 66 亿个参数。
为了添加另一个模型并方便下载,我们可以定义一些变量、更改权限并下载模型。这是 NVIDIA 教程 中的一个示例:
CONTAINERS_DIR=<where_jetson-containers_is_located>
MODEL_DIR=$CONTAINERS_DIR/data/models/stable-diffusion/models/Stable-diffusion/
sudo chown -R $USER $MODEL_DIR
现在下载模型:
wget -P $MODEL_DIR https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
wget -P $MODEL_DIR https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors
下载模型后,如果容器正在运行,可以刷新检查点下拉菜单,或者重新启动容器。
现在我们有两个额外的模型可供选择。

以下是使用 XL 模型生成的一个示例,使用的提示如下:
一个肖像,时尚模特穿着未来风格的服装,置身于赛博朋克屋顶环境中,背景是霓虹灯点缀的城市,城市光辉作为背光,时尚摄影

添加其他模型
我们还可以添加更多模型。除了 Hugging Face,Civitai 是另一个可以选择更多模型的中心。Civitai 有一些 NSFW 模型,请自行斟酌。
选择你想要的模型,下载检查点并将其放置在模型目录中:
/home/<user>/<jetson-containers-location>/data/models/stable-diffusion/models/Stable-diffusion/
我将下载并尝试一个名为 DreamShaper XL 的模型。

记住,有些模型可能无法正常工作。
你需要调整设置并阅读模型卡片,以了解哪些设置可能最适合(如果有的话)。
例如,这个模型卡片指出采样步数应该是 4-8,采样方法应该是 DPM++ SDE Karras 等等。
下载模型检查点文件并将其添加到上述目录中。
刷新后,你应该可以选择该模型。 在选择时,AUTOMATIC1111 会优化模型。
如果程序被终止或出现错误,请增加存储空间。我之前也遇到过这个问题,增加存储空间后,一切都正常了。
使用以下提示词:
手持法杖,orbstaff <lora:orbstaff:0.60> ,,(由 Gabriel Isak 和 Adam Elsheimer 创作:1.20),(由 Jon Whitcomb、Bayard Wu 和 Malcolm Liepke 创作:0.80),8k,专业时尚摄影
来自这张图片, 在没有负面提示词的情况下,我得到了以下结果:

使用以下设置:

还记得之前用 Stable Diffusion XL 模型生成赛博朋克女孩的提示词吗?
这是一个新图像,使用相同的提示词,通过 DreamShaper XL 模型和上述相同的设置生成:

正如你所见,只要掌握了参数调整的方法,就可以生成出色的图像。:)
我发现更大的图像往往能产生更好的结果。
希望你已经学会了如何使用 Nvidia Jetson NX 16GB 生成图像,以及如何将其用作按需生成图像的服务器。
✨ 贡献者项目
技术支持与产品讨论
感谢您选择我们的产品!我们为您提供多种支持渠道,以确保您使用我们的产品时体验顺畅。我们提供多种沟通方式,以满足不同的偏好和需求。