使用 FLUX、PyTorch 和 Streamlit 构建 AI 图像生成应用程序
近年来,对 AI 生成图像的需求迅速增长。这些图像不仅用于艺术目的,还可用于各个行业的实际应用。例如,在时尚行业,AI 生成的图像可用于创建展示服装的虚拟模型。在汽车行业,AI 生成的图像可用于设计和测试新车型。最好的部分是什么?您现在可以在 Koyeb GPU 上运行自己的 AI 图像生成机器。
FLUX.1 [dev] 模型(由 BlackForestLabs 开发)是一种先进的 AI 图像生成模型,可产生出色的输出质量。它是一个 120 亿参数整流转换器,能够根据文本描述生成图像。它具有竞争性的提示跟随功能,并使用指导蒸馏进行训练。此外,生成的输出可用于个人、科学和非商业用途,如 FLUX.1 [dev] 非商业许可证中所述。
在本教程中,我们将学习如何设置 Streamlit 应用程序、集成 FLUX 模型进行实时图像生成,并使用 Docker 和 Koyeb 部署应用程序,确保可扩展的图像生成服务。
您可以使用下面的部署到 Koyeb 按钮部署本教程中构建的 FLUX 应用程序:
要求
要成功完成本教程,您需要满足以下条件:
了解组件
文本到图像生成和 FLUX 模型
文本到图像的生成过程涉及模型解释输入文本并将其转换为视觉表示。此过程包括几个步骤:首先,模型将文本输入编码到潜在空间中,捕获单词的语义。接下来,它采用生成过程从该潜在空间中采样,生成与所述概念一致的图像。由 BlackForestLabs 开发的 FLUX 模型是一个最先进的 120 亿参数整流转换器,在包含图像对及其相应文本描述的大量数据集上进行训练。这种训练使模型能够学习语言和视觉内容之间的复杂关系。因此,用户可以输入详细的提示,FLUX 模型会生成准确(和创造性)反映这些提示的图像。
Streamlit
Streamlit 是一个开源 Python 库,旨在创建交互式数据应用程序(通常称为仪表板)。它使开发人员能够简单直观地构建和共享数据应用程序,而无需大量的 Web 开发专业知识。
Streamlit 应用程序以 Python 脚本的形式创建,然后在 Streamlit 环境中执行。该库提供了一组函数,可用于向应用程序添加交互元素,例如上传文件按钮。
步骤
设置环境
让我们从创建一个新的 Streamlit 项目开始。为了保持 Python 依赖项井然有序,您应该创建一个虚拟环境。
首先,创建并导航到本地目录:
# Create and move to the new directory mkdir example-koyeb-flux-images cd example-koyeb-flux-images
之后,创建并激活一个新的虚拟环境:
# Create a virtual environment python -m venv venv # Active the virtual environment (Windows) .\venv\Scripts\activate.bat # Active the virtual environment (Linux) source ./venv/bin/activate
现在,创建一个具有以下依赖项的“requirements.txt”文件:
streamlit watchdog diffusers torch torchvision einops huggingface_hub[hf_transfer] safetensors sentencepiece transformers tokenizers protobuf requests invisible-watermark accelerate peft
在依赖项方面,我们包含了用于用 Python 构建 Web 应用的 Streamlit、用于实时本地使用 FLUX 模型的 Hugging Face 以及用于监视文件系统事件的 watchdog。`accelerate` 包用于简化机器学习模型的训练和推理过程,使管理分布式训练和优化性能变得更加容易。`invisible-watermark` 包用于在生成的内容中嵌入不可见的水印,确保模型生成的输出的唯一性。
现在,您可以使用以下命令安装依赖项:
pip install -r requirements.txt
现在,让我们继续创建一个新的 Streamlit 项目。
设置 Streamlit
在此步骤中,您将设置 Streamlit UI,它将定义页面的视觉布局,以及用户加载 FLUX 模型以开始使用 AI 生成图像的能力。项目的所有逻辑都将驻留在此文件中,因此您可以先使用以下代码创建一个“app.py”文件:
# File: app.py import os, torch, streamlit from diffusers import FluxPipeline from huggingface_hub import login, snapshot_download # Log in to Hugging Face using the provided token from environment variables login(token=os.getenv('HF_TOKEN')) # Set the title of the Streamlit application streamlit.title("AI Image Generation with FLUX.1-dev") # Create a text input field for the user to enter a prompt for image generation prompt = streamlit.text_input("Enter your prompt:", "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k") # Create four columns for user inputs col1, col2, col3, col4 = streamlit.columns(4) # Column 1: Input for image width with col1: num_width = streamlit.number_input("Width:", min_value=1, value=256) # Column 2: Input for image height with col2: num_height = streamlit.number_input("Height:", min_value=1, value=256) # Column 3: Input for the number of images to generate with col3: num_images = streamlit.number_input("Images:", min_value=1, value=3) # Column 4: Input for the number of inference steps with col4: num_inference_steps = streamlit.number_input("Steps:", min_value=1, value=3) # Button to load the model from Hugging Face if streamlit.button("Load Model"): snapshot_download(repo_id="black-forest-labs/FLUX.1-dev", cache_dir="./FLUX_1_dev")
上面的代码执行以下操作:
这样,您就设置了一个可以根据用户请求加载 FLUX 模型的 UI。现在,让我们继续根据用户提示和设置生成 AI 图像。
使用 FLUX 模型生成 AI 图像
在此步骤中,您将调用 FLUX 模型根据用户提示生成 AI 图像。根据输入中设置的默认值,模型将为用户的每个提示生成 3 张图像。在 `app.py` 文件中进行以下添加:
# File: app.py # Existing code # Button to generate images using the FLUX model if streamlit.button("Generate Image"): # Load the FLUX model with specified parameters pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev", torch_dtype=torch.bfloat16, cache_dir="./FLUX_1_dev") # Generate images based on the user input parameters images = pipe(prompt=prompt, num_inference_steps=num_inference_steps, height=num_height, width=num_width, num_images_per_prompt=num_images).images # Create three columns to display the generated images cols = streamlit.columns(3) # Loop through the generated images and display them in the columns for i, image in enumerate(images): cols[i % 3].image(image, caption=prompt)
上面的代码添加执行以下操作:
现在,你可以使用以下方法运行 Streamlit 应用程序:
streamlit run ./app.py --server.port 8000
该应用程序现在已在 http://localhost:8000 上准备就绪。通过更改默认输入值和您自己的自定义提示来生成 AI 图像,从而测试该应用程序。
现在,让我们将应用程序docker化,以确保多个部署之间的一致性。
将 Streamlit 应用程序 Docker 化
Docker 化部署有助于创建一致且可重复的环境,确保应用程序在任何系统上以相同的方式运行。它简化了依赖项管理并增强了可扩展性,使部署更加高效和可靠。要进行 docker 化,请使用以下代码在项目的根目录中创建一个“Dockerfile”:
FROM python:3.12 AS runner WORKDIR /app COPY app.py requirements.txt . RUN pip install -r requirements.txt --root-user-action=ignore RUN pip install --pre torch --index-url https://download.pytorch.org/whl/nightly/cu121 --root-user-action=ignore # [!code ++] RUN apt-get update RUN apt-get install -y libsm6 libxext6 git git-lfs # [!code ++] RUN rm -rf /var/lib/apt/lists/* EXPOSE 8000 # [!code ++] ENV HF_HUB_ENABLE_HF_TRANSFER=1 ARG HF_TOKEN # [!code ++] CMD ["streamlit", "run", "./app.py", "--server.port", "8000"] # [!code ++]
除了用于部署 Python 应用程序的常用 Dockerfile 之外,还对此代码进行了以下调整/添加:
完成所有配置后,让我们继续将应用程序部署到 Koyeb。
部署至 Koyeb
现在您已经在本地运行该应用程序,您还可以将其部署在 Koyeb 上并使其在互联网上可用。
在您的 GitHub 帐户上创建一个新的存储库,以便您可以推送您的代码。
您可以从 GitHub 下载 Python 的标准 .gitignore 文件,以排除将某些目录和文件推送到存储库:
curl -L https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore -o .gitignore
在终端中运行以下命令来提交并将代码推送到存储库:
git init git add . git commit -m "first commit" git branch -M main git remote add origin [Your GitHub repository URL] git push -u origin main
现在,您应该已将所有本地代码保存在远程存储库中。现在是时候部署应用程序了。
在 Koyeb 控制面板中的“概述”选项卡上,单击“创建 Web 服务”以启动应用程序创建和部署过程。
应用程序部署完成后,您可以访问 Koyeb 服务 URL(以 `.koyeb.app` 结尾)来访问 Streamlit 应用程序。
结论
在本教程中,您使用带有 Streamlit 框架的 FLUX dev 模型构建了一个 AI 图像生成应用程序。在此过程中,您学习了如何在 Python 中调用 Flux 管道来随时生成 AI 图像,使用用户提供的提示和设置进行自定义,并使用 Streamlit 框架快速制作用户界面原型。
鉴于应用程序是使用 Git 部署选项部署的,随后将代码推送到已部署的分支将自动为您的应用程序启动新的构建。部署成功后,对应用程序的更改将生效。如果部署失败,Koyeb 会保留最后一次可运行的生产部署,确保您的应用程序不间断运行。