Docker 作图咒语生成器搭建指南

项目下载

复制代码
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

相关推荐
smj2302_796826522 小时前
解决leetcode第3768题.固定长度子数组中的最小逆序对数目
python·算法·leetcode
木头左2 小时前
位置编码增强法在量化交易策略中的应用基于短期记忆敏感度提升
python
Acc1oFl4g2 小时前
详解Java反射
java·开发语言·python
ney187819024743 小时前
分类网络LeNet + FashionMNIST 准确率92.9%
python·深度学习·分类
Data_agent4 小时前
1688获得1688店铺列表API,python请求示例
开发语言·python·算法
2401_871260024 小时前
Java学习笔记(二)面向对象
java·python·学习
2301_764441334 小时前
使用python构建的应急物资代储博弈模型
开发语言·python·算法
喏喏心5 小时前
深度强化学习:价值迭代与Bellman方程实践
人工智能·python·学习·机器学习
小白勇闯网安圈5 小时前
supersqli、web2、fileclude、Web_python_template_injection
python·网络安全·web