Skip to main content

如何在 reComputer 上运行本地 LLM 文本转图像

介绍

文本转图像模型是一种人工智能(AI)模型,它可以根据文本描述生成图像。这些模型接受文本输入,如描述场景的句子或段落,并基于该描述生成图像。

这些模型在包含文本描述和相应图像对的大型数据集上进行训练,学习理解文本和视觉信息之间的关系。

文本转图像模型近年来取得了显著进展,但生成准确匹配文本描述的高质量和多样化图像仍然是 AI 研究中的一项挑战性任务。

概述

在本教程中,我们将探索几种部署和运行本地 LLM 文本转图像的方法:

  1. 创建虚拟环境(TensorFlow 和 PyTorch)
    • 1.1. 使用 Keras Stable Diffusion 创建示例
    • 1.2. 使用 Hugging Face 上可用的模型之一创建示例
    • 1.3. 创建一个小型 Python API,我们将使用它通过调用 API 为 Keras 和 Hugging Face 生成图像
  2. 使用 Nvidia 容器。

故障排除

在开始之前,这里有一些步骤可以帮助我们获得更多可用内存。

  1. 禁用桌面 GUI。我们可以通过 SSH 使用 Jetson。我们可以节省大约 ~800MB 的内存。

  2. 禁用 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

After creating it, activate the virtual environment

source kerasStableEnvironment/bin/activate

激活后,您将在提示符前看到它的名称

进入虚拟环境

cd kerasStableEnvironment

Upgrade PIP and install some dependencies

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

Install TensorFlow for Jetpack 5.1.1

To find what JetPack version we have, issue the following command:

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'))"

This should return the following line:

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
PyTorch

让我们安装一些依赖项

sudo apt install libopenblas-dev

Now, install PyTorch for JetPack 5.1.1

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

To check the installation and if CUDA is available

python -c "import torch; print(torch.cuda.is_available())"

它应该返回 True

现在我们已经安装了 TensorFlow 和 PyTorch,让我们安装 Keras 并创建一个图像

1.1 Keras

在安装了 PyTorchTensorflow 之后,我们现在准备开始从文本提示创建图像。 确保您仍在虚拟环境中。

KerasCV 有一个 Stability.ai 文本到图像模型 Stable Diffusion 的实现(以及其他几个)。

通过使用 KerasCV 实现,我们可以使用一些性能优势,如 XLA 编译和混合精度支持。

您可以在 Keras 网站上阅读更多信息

安装 keras 和依赖项。我们选择这些版本是因为它们与我们已安装的 TensorFlow(或 PyTorch)版本兼容。

pip install keras-cv==0.5.1
pip install keras==2.12.0
pip install Pillow

Open your preferred editor and type the following example

vi generate_image.py
import keras_cv
import keras
from PIL import Image

keras.mixed_precision.set_global_policy("mixed_float16")

model = keras_cv.models.StableDiffusion (
img_width=512, # we can choose another size, but has to be a mutiple of 128
img_height=512, # the same above
jit_compile=True
)

prompt = "a cute magical flying dog, fantasy art, golden color, high quality, highly detailed, elegant, sharp focus, concept art, character concepts, digital painting, mystery, adventure"

image = model.text_to_image (prompt,
num_steps = 25, #image quality
batch_size = 1 # how many images to generate at once
)

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

After creating the virtual environment, let's enter it. Install PyTorch using the instructions above.

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

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")

prompt = "a master jedi cat in star wars holding a lightsaber, wearing a jedi cloak hood, dramatic, cinematic lighting"
image = pipe(prompt).images[0]

image.save("cat_jedi.png")

Let's try the model.

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 = "full body, cat dressed as a Viking, with weapon in his paws, battle coloring, glow hyper-detail, hyper-realism, cinematic"

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

Activate the environment and enter it

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

Now, let's start to write our application.

vi app.py

For those who don't know what Flask is or does, let's try a small example.

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)

To run, execute the python script:

python app.py

您应该看到以下内容:

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

我们所做的是导入Flask类

import Flask

We next created an instance of the Flask class

app = Flask(__name__)

We next create a route decorator to tell Flask what URL will trigger our function

@app.route("/generate_image")

When using generate_image in the URL, we will trigger our function

def generate_image_api():
return "<h2>Hello World !</h2>"

We can also use curl to access our API

curl http://192.168.2.230:8080/generate_image

现在我们知道了如何创建一个 API,让我们深入了解并编写它。

vi app.py

And paste the code

from flask import Flask, request, send_file
import random, string
import keras_cv
import keras
from PIL import Image

#define APP
app = Flask (__name__)


#option for keras
keras.mixed_precision.set_global_policy("mixed_float16")

# generate custom filename
def generate_random_string(size):
"""Generate a random string of specified size."""
return ''.join(random.choices(string.ascii_letters + string.digits, k=size))


"""
This is the function that will generate the image
and save it using a random created filename
"""
def generate_image(prompt):

model = keras_cv.models.StableDiffusion (
img_width=512, # we can choose another size, but has to be a mutiple of 128
img_height=512, # the same above
jit_compile=True
)

image = model.text_to_image (prompt,
num_steps = 25,
batch_size = 1
)

# image filename
filename = generate_random_string(10) + ".png"
Image.fromarray(image[0]).save(filename)
return filename # return filename to send it to client


#define routes
# Use this to get the prompt. we're going to receive it using GET
@app.route("/generate_image", methods=["GET"])
def generate_image_api():
# get the prompt
prompt = request.args.get("prompt")
if not prompt:
# let's define a default 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 并等待。

如果我们不给它提示词,它将使用我们设置的默认提示词。

在CLI中,你可以看到图像正在生成

在浏览器中,过一会儿,我们可以看到图像

我们也可以看到图像已经被发送

我们也可以使用curl来获取图像并保存它。

如果我们想给它一个提示词(我们应该这样做),URL将看起来像 http://jetsonIP:8080/generate_image?prompt=&lt;your_prompt>

我们可以扩展这个例子来构建一个更好的页面,比如为用户输入添加一些文本框,一个漂亮的背景等等。但这是另一个项目的内容。

步骤2 - Nvidia LLM

Stable Diffusion v1.5

我们可以使用Jetson Containers项目来运行使用AUTOMATIC1111的stable-diffusion-webui。 Jetson Containers项目由NVIDIA员工Dusty Franklin运行。

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

Now that we have everything we need, let's run the container with the 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 上运行服务器。

在这里,我一开始没有成功。无论我按多少次刷新按钮,都不会出现可选择的检查点。

我发现我的存储空间已经 100% 占满了。

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

我一直在测试其他模型,它们占用了所有空间。 如果你遇到这种情况,只需进入你的主目录,找到隐藏的缓存目录并删除 huggingface 目录。

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

Now, download the model

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 模型生成的示例,使用以下提示词:

A Portrait, fashionable model wearing futuristic clothing, in a cyberpunk roof-top environment, with a neon-lit city background, backlit by vibrant city glow, fashion photography

试试看。记住,选择某些选项时可能无法正常工作。

添加其他模型

我们还可以添加更多模型。除了 Hugging Face,Civitai 是另一个拥有更多模型可供选择的平台。Civitai 有一些 NSFW 模型,所以请注意。

选择您想要的模型,下载检查点并将它们放在 models 目录中

/home/<user>/<jetson-containers-location>/data/models/stable-diffusion/models/Stable-diffusion/

我将下载并尝试一个名为 DreamShaper XL 的模型。

请记住,某些模型可能无法正常工作。

您需要调整设置并阅读模型卡片,以了解哪些设置可能效果最佳(如果有的话)。

例如,这个模型卡片说采样步数应该是 4-8,采样方法应该是 DPM++ SDE Karras 等等...

下载模型检查点并将其添加到上述目录中。

刷新后,您应该可以选择该模型。 选择时,AUTOMATIC1111 将优化模型。

如果出现被终止或错误,请获取更多空间。这种情况发生在我身上,在获得更多空间后,一切都正常工作了。

使用以下提示词

holding a staff, orbstaff <lora:orbstaff:0.60> , ,(by Gabriel Isak and Adam Elsheimer:1.20), (by Jon Whitcomb and Bayard Wu and Malcolm Liepke0.80),8k , professional fashion shot

来自这张图片, 没有负面提示词,我得到了以下结果

使用这些设置:

还记得上面使用 Stable Diffusion XL 模型生成赛博朋克女孩的提示词吗?

这是一张新图片,使用相同的提示词,用 DreamShaper XL 和上述相同设置生成的

如您所见,可以创建出精美的图像,前提是您知道要调整的参数。:)

我了解到更大的图像往往会产生更好的结果。

希望您已经学会了如何使用 Nvidia Jetson NX 16GB 生成图像,以及如何将其用作服务器来按需生成图像。

✨ 贡献者项目

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...