项目下载
git clone https://github.com/soulteary/docker-prompt-generator.git
接着,进入项目目录,使用 Nvidia 原厂的 PyTorch Docker 基础镜像来完成基础环境的构建
# 构建基础镜像
docker build -t soulteary/prompt-generator:base . -f docker/Dockerfile.base
# 构建 CPU 应用
docker build -t soulteary/prompt-generator:cpu . -f docker/Dockerfile.cpu
在构建基础镜像会遇到问题
1.Error response from daemon: Dockerfile parse error line 11: FROM requires either one or three arguments 把Dockerfile.base中这段代码
RUN cat > /get-models.py <<EOF
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
AutoModelForSeq2SeqLM.from_pretrained('Helsinki-NLP/opus-mt-zh-en')
AutoTokenizer.from_pretrained('Helsinki-NLP/opus-mt-zh-en')
pipeline('text-generation', model='succinctly/text2image-prompt-generator')
EOF
改成
RUN echo "from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline" > /get-models.py && \
echo "AutoModelForSeq2SeqLM.from_pretrained('Helsinki-NLP/opus-mt-zh-en')" >> /get-models.py && \
echo "AutoTokenizer.from_pretrained('Helsinki-NLP/opus-mt-zh-en')" >> /get-models.py && \
echo "pipeline('text-generation', model='succinctly/text2image-prompt-generator')" >> /get-models.py
2.failed open: failed to authorize: rpc error: code = Unknown desc = failed to fetch anonymous token: unexpected status: 401 Unauthorized
大体是授权不行的问题,尝试几次docker login后问题自行消失
3.huggingface 被墙,总是返回网络多次尝试连接后失败的错误
开始尝试在linxu上进行翻墙
https://github.com/Alvin9999/new-pac/wiki/Linux系统翻墙方法
采用第一种方案下载v2ray可运行源代码包
配置config.json,这个配置是我自己机器上导出的,注意开启1080,1090两个端口,并且127.0.0.1改成0.0.0.0,因为docker容器内翻墙出来一个外网可访问的代理端口
{
"log": {
"error": "",
"loglevel": "info",
"access": ""
},
"inbounds": [
{
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"ip": "",
"userLevel": 0,
"udp": false,
"auth": "noauth"
},
"port": "1080"
},
{
"listen": "0.0.0.0",
"protocol": "http",
"settings": {
"timeout": 360
},
"port": "1090"
}
],
"outbounds": [
{
"mux": {
"enabled": false,
"concurrency": 8
},
"protocol": "vmess",
"streamSettings": {
"wsSettings": {
"path": "/",
"headers": {
"host": "127.cheat8.xyz"
}
},
"tlsSettings": {
"allowInsecure": true
},
"security": "none",
"network": "ws"
},
"tag": "agentout",
"settings": {
"vnext": [
{
"address": "47.236.30.127",
"users": [
{
"id": "8502a070-edc8-32e0-99b7-a05a517c5cf1",
"alterId": 0,
"level": 0,
"security": "aes-128-gcm"
}
],
"port": 80
}
]
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "AsIs",
"redirect": "",
"userLevel": 0
}
},
{
"tag": "blockout",
"protocol": "blackhole",
"settings": {
"response": {
"type": "none"
}
}
}
],
"dns": {
"servers": [
""
]
},
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"outboundTag": "direct",
"type": "field",
"ip": [
"geoip:cn",
"geoip:private"
],
"domain": [
"geosite:cn",
"geosite:speedtest"
]
}
]
}
},
"transport": {}
}
启动命令即可
./v2ray -config config.json
设置http请求走代理,把它封装成alias方便执行
vim ~/.bashrc
在末尾补上
alias setproxy="export ALL_PROXY=http://127.0.0.1:1090"
alias unsetproxy="unset ALL_PROXY"
让alias命令生效
source ~/.bashrc
需要代理时执行
setproxy
取消代理时执行
unsetproxy
测试代理是否成功,如果返回其他ip地点表示成功
curl http://myip.ipip.net
这里有个特殊问题,容器里的网络其实和宿主机的网络是不一样的,现在我只是在宿主机实现了代理,容器里的http请求还是没法代理,所以我必须手动调整让容器里的代码强行走代码,并且代理端口要指向宿主机的ip而不是127.0.0.1
最终把get-models.py抽离成单独的文件,具体目录是在 docker-prompt-generator-main/get-models.py
import os
os.environ["http_proxy"] = "http://42.193.142.230:1090"
os.environ["https_proxy"] = "http://42.193.142.230:1090"
AutoModelForSeq2SeqLM.from_pretrained('Helsinki-NLP/opus-mt-zh-en')
AutoTokenizer.from_pretrained('Helsinki-NLP/opus-mt-zh-en')
pipeline('text-generation', model='succinctly/text2image-prompt-generator')
docker-prompt-generator-main/docker/Dockerfile.base也一并调整
FROM nvcr.io/nvidia/pytorch:22.12-py3
LABEL org.opencontainers.image.authors="soulteary@gmail.com"
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
pip install transformers sentencepiece sacremoses && \
pip install gradio
WORKDIR /app
ADD /get-models.py //
RUN python /get-models.py && \
rm -rf /get-models.py
最后运行容器,把gpus参数去掉
# Run the CPU image
docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -p 7860:7860 soulteary/prompt-generator:cpu
没想到启动关头又报了个新错
block.queue(max_size=64).launch(show_api=False, enable_queue=True, debug=True, share=False, server_name='0.0.0.0') 说不支持enable_queue参数
把enable_queue=True移除后,重新构建cpu镜像后(把修改后的文件同步到镜像里)再启动容器
docker build -t soulteary/prompt-generator:cpu . -f docker/Dockerfile.cpu
docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -p 7860:7860 soulteary/prompt-generator:cpu
最终部署起来啦,可以访问ip:7860尽情体验了
不通过docker部署的方式
下载项目
git clone https://github.com/soulteary/docker-prompt-generator
遇到克隆不下来的问题,一般是git被墙的问题,设置下代理即可
#代理设置
git config --global http.proxy 42.193.142.230:1090
#取消代理
git config --global --unset http.proxy
conda安装python环境,每个项目最好单独起一个环境,避免项目所依赖的库冲突
conda create --name python310 python=3.10
conda activate python310
修改 /root/.condarc(视情况而定,conda源码有问题再修改)
channels:
- defaults
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
show_channel_urls: True
检查cuda和pytorch是否兼容
#CUDA是NVIDIA针对GPU加速计算而开发的编程框架。通过PyTorch可以很方便地使用CUDA,无须过多地改变代码
#输出True则兼容
import torch
print(torch.__version__)
print(torch.cuda.is_available())
如果上面检查不过,则安装支持cuda的pytorch(发挥GPU)
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
安装其他
pip install transformers sentencepiece sacremoses
pip install gradio
pip install clip_interrogator
修改 app/webui.gpu.py python app/webui.gpu.py
头部增加
import os
os.environ["http_proxy"] = "http://42.193.142.230:1090"
os.environ["https_proxy"] = "http://42.193.142.230:1090"
import os
os.environ["http_proxy"] = "http://43.139.153.173:1090"
os.environ["https_proxy"] = "http://43.139.153.173:1090"
最后一行改为
block.queue(max_size=64).launch(show_api=False, debug=True, share=True, server_name='0.0.0.0',server_port=8080)
最后执行py脚本
python app/webui.gpu.py
最新遇到的坑,(这个就是因为我没有单独创建一个conda环境的,sd项目依赖的库是3.41.2,和这个项目冲突了)
#gradio 版本问题,要4.7.1才行
#卸载掉旧版本
pip uninstall gradio
#安装指定版本
pin install gradio=4.7.1
用api的方式调用最终跑起来的项目功能
#编写app/api.py
from flask import Flask, request, jsonify
from gradio_client import Client
app = Flask(__name__)
client = Client("http://81.71.140.193:7860/")
@app.route('/predict', methods=['POST'])
def predict():
image_url = request.json['url']
result = client.predict(image_url, "fast",fn_index=0)
return jsonify({"result": result})
if __name__ == '__main__':
app.run(host='0.0.0.0',port= 5000,debug=True)
运行api脚本
python app/api.py
参考链接
基于pytorch的yolov5运行报错warnings.warn('User provided device_type of 'cuda', but CUDA is not available)https://blog.csdn.net/weixin_50813961/article/details/122587255
【已解决】配置pytorch环境中出现的报错:Collecting package metadata (current_repodata.json): failedhttps://blog.csdn.net/qq_54024805/article/details/131322811