部分配置:
腾讯云环境,Ubuntu 20.04.5 LTS ,GPU:T4。
前置准备:
【创建docker环境】
这是运维同学帮忙搞的,这里就不细说了。
主要实现创建一个能够使用nvidia driver的docker,命名为chatgpt。装好GPU驱动,能够实现在docker内使用nvidia-smi命令查看GPU情况。这里是根据这篇文章操作的Docker容器如何优雅使用NVIDIA GPU-腾讯云开发者社区-腾讯云
![](https://img-blog.csdnimg.cn/img_convert/b5edac08149ddd5810be67aaf63523a6.png)
题外话:这里docker container内部的CUDA version和外部机子上显示的不同。这里是11.4,外面只支持到11.0。保险起见都用cuda 10.2,保证稳定。
可能有帮助的命令:
-查看linux版本:cat /etc/os-release
step1. 找到对应cuda版本
历史cuda的release:CUDA Toolkit Archive | NVIDIA Developer
cuda 10.2:CUDA Toolkit 10.2 Download | NVIDIA Developer
-下载命令:
wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
没有ubuntu20.04的对应版本没关系,直接楞搞18.04的就行。(向后兼容)下载之后,运行run文件。
sudo sh cuda_10.2.89_440.33.01_linux.run
执行遇到报错,缺少一个文件:
sh cuda_10.2.89_440.33.01_linux.run
./cuda-installer: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory
直接安装就行: apt install libxml2
-安装过程中会需要选 时区和城市 对应选择就可以。
完成后,再次运行run文件会报错:
Failed to verify gcc version. See log at /var/log/cuda-installer.log for details.
查找一下cuda10.2的要求:需要gcc7.3.0
![](https://img-blog.csdnimg.cn/img_convert/7709d4bfaacfe11144d6c9f708a93784.png)
看一下container里面的版本:
gcc -V
![](https://img-blog.csdnimg.cn/img_convert/4ab6ea7e9549f21e53252216f08855d1.png)
nice! 甚至没装!非常纯净(狗头)
apt install gcc-7
再次启动run文件,还是报错
下载gcc-7.5 并且做软连接之后解决。
![](https://img-blog.csdnimg.cn/img_convert/02bee97074de629577e53f8961dacbca.png)
![](https://img-blog.csdnimg.cn/img_convert/854de8be114334cf616166676b15c6db.png)
驱动已经安装,把第一项取消选择之后install。
还是报错。
执行
sh cuda_10.2.89_440.33.01_linux.run --silent --toolkit --samples --librarypath=/usr/local/cuda-10.2
后搞定。
step2. 安装anaconda
这部分教程太多了,也非常简单就不细讲了。
装完之后我们下一步创建虚拟环境
step3. 创建虚拟环境
python 版本限制3.10.9
step4. 尝试安装stable diffusion 需要的组件
stabilityai/stable-diffusion-2 · Hugging Face
pip install -i Simple Index transformers
以及其他几个包。这部分比较简单就不细讲了。
step5. 基于diffusers写一个基于fastapi的python脚本,直接nohup python启动就完事~
我这个目前已经写的很复杂了,集成了很多和其他系统的交互,就不贴源码了。贴一个GPT写的版本吧。大概展示个意思。
from fastapi import FastAPI, HTTPException
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
from PIL import Image
import io
import base64
import uvicorn
app = FastAPI()
model_id = "stabilityai/stable-diffusion-2"
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
def generate_image(prompt):
image = pipe(prompt).images[0]
return image
def image_to_base64(image):
buffered = io.BytesIO()
image.save(buffered, format="PNG")
return base64.b64encode(buffered.getvalue()).decode("utf-8")
@app.get("/generate_image/{prompt}")
def generate_image_api(prompt: str):
try:
generated_image = generate_image(prompt)
base64_image = image_to_base64(generated_image)
return {"base64_image": base64_image}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error generating image: {str(e)}")
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000, reload=True)