前言
技术要点:Wsl+Docker+MangaImageTranslator+ComicRead
项目地址
1.配置WSL
① 安装WSL
默认安装位置:C:\Users\PC\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState
wsl --install
② 设置WSL启动占用
在C:\Users\PC下创建.wslconfig 文件,并配置内容
[wsl2]
# 是否强制 WSL2/WSLg 子系统使用 Windows 代理设置(请根据实际需要启用)
autoProxy=true
# WSL2/WSLg DNS 代理隧道,以便由 Windows 代理转发 DNS 请求(请根据实际需要启用)
dnsTunneling=true
# WSL2/WSLg 子系统的 Windows 防火墙集成,以便 Hyper-V 或者 WPF 能过滤子系统流量(请根据实际需要启用)
firewall=true
# 启用 WSLg GUI 图形化程序支持
guiApplications=true
# 启用 IPv6 网络支持
ipv6=false
# 启用 localhost 网络转发支持
localhostForwarding=true
# 限制 WSL2/WSLg 子系统的最大内存占用
memory=2GB
# 将交换存储空间设置为 2GB,默认为可用内存的 25%
swap=2GB
# 启用 WSL2/WSLg 子系统嵌套虚拟化功能支持
nestedVirtualization=true
# 启用镜像网络特性支持
networkingMode=mirrored
# 启用 WSL2/WSLg 子系统页面文件通报,以便 Windows 回收已分配但未使用的内存
#pageReporting=true
# 设置 WSL2/WSLg 子系统的逻辑 CPU 核心数为 8(最大肯定没法超过硬件的物理逻辑核心数)
processors=6
# 实验性功能
[experimental]
# 启用空闲内存自动缓慢回收
autoMemoryReclaim=gradual
# 启用 WSL2/WSLg 子系统和 Windows 宿主之间的本地回环互通支持
hostAddressLoopback=true
# 启用 WSL2/WSLg 子系统虚拟硬盘空间自动回收
sparseVhd=true
# 和 dnsTunneling 配合使用,决定是否使用 Windows DNS 缓存池
useWindowsDnsCache=false
1.2 出现的问题
进入wsl后输入
touch ~/.sudo_as_admin_successful
2.安装docker desktop for windows
打开docker for desktop后会在C:\Users\PC\AppData\Local\Docker\wsl创建两个磁盘
① 依次将磁盘移动到D盘
wsl -l -v #查看版本和wsl列表
wsl --shutdown #关闭系统
wsl --export docker-desktop D:\Environment\Docker\data-desktop.tar #移出数据
wsl --unregister docker-desktop #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop D:\Environment\Docker\main\ D:\Environment\Docker\data-desktop.tar #导入数据
wsl --export docker-desktop-data D:\Environment\Docker\docker-desktop-data.tar #移出数据
wsl --unregister docker-desktop-data #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2 #导入数据
② 删除打包文件
参考文献
D:\Environment\Docker\data-desktop.tar 和 D:\Environment\Docker\docker-desktop-data.tar
③ 手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数
...
"customWslDistroDir": "D:\\Environment\\Docker",
...
原:读取与安装位置C:\Users\PC\AppData\Local\Docker\wsl
改完后:读取与安装位置D:\Environment\Docker
此时启动docker 会读取D:\Environment\Docker下disk和main这两个文件夹下的的vhdx磁盘文件
④ 验证 打开docker,验证docker,进入cmd后
docker version
3.移动ubantu系统 (wsl操作系统容器的移动)
① 进行转移
wsl -l -v #查看版本和wsl列表
wsl --shutdown #关闭系统
wsl --export Ubuntu D:\Environment\Ubuntu\ubuntu.tar #移出数据
wsl --unregister Ubuntu #卸载子系统
wsl -l -v #查看是否删除
wsl --import Ubuntu D:\Environment\Ubuntu\ D:\Environment\Ubuntu\ubuntu.tar --version 2 #导入数据
ubuntu.exe config --default-user <你之前的用户名> # 修改用户名
② 删除D:\Environment\Ubuntu\ubuntu.tar
③ 更改wsl默认子系统
wslconfig /setdefault Ubuntu
wslconfig /list #查看
4.Docker打开GPU服务
如果你有一张好显卡非常建议使用GPU处理速度会快很多很多,能够处理的质量也会变高,更加不会为频繁的报错所烦恼!!!
① 首先确保你的英伟达显卡驱动版本在552 以下
<高版本会报错!别问我怎么知道的 2024.6.30 是这个情况>
如果你不幸安装了高版本需要降低版本
如何解决?
② 安装nvidia-container-toolkit和 nvidia-docker2 来确保你的容器中能够使用GPU
参考1
参考2
参考3
首先进入cmd进入WSL
如果安装不上需要配置ubantu的镜像源
wsl
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
这里运行完以后需要修改 Windows Docker for Desktop中daemon.json的配置 并 配置镜像加速【2024.7.1】
...
"registry-mirrors": [
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
...
③ 修改docker-comose.yaml文件
version: "3.8"
name: manga_image_translator
services:
manga_image_translator:
image: zyddnys/manga-image-translator:main
container_name: manga_image_translator_gpu
command: --manga2eng -v --mode web --host=0.0.0.0 --port=5003 --translator google --use-gpu
volumes:
- ./result:/app/result
environment:
- OPENAI_API_KEY=<你的gpt_api_key>
- OPENAI_API_BASE=<你的gpt_api_url>
- SAKURA_API_BASE=<你的sakura_api_rul>
ports:
- 5003:5003
ipc: host
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: "all"
capabilities: ["gpu"]
修改好以后重新启动容器,就能使用GPU了
④ 检测并验证 wsl中输入 nvidia-smi
查看当前GPU信息,然后 docker ps
查询到运行起来的manga_image_translator容器
进入manga_image_translator容器并输入 nvidia-smi
检测GPU信息,能有返回结果就是部署好GPU服务了
然后在容器中输入 python
进入python控制台
>> import torch
>> print(torch.cuda.is_available())
此时 返回True 就是成功了!
4.2.解决报错问题
报错提示:AttributeError: module 'openai' has no attribute 'AsyncOpenAI'
需要进入docker容器中升级openai模组
D:\Environment\manga-image-translator> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59654f5a53b6 zyddnys/manga-image-translator:main "python -m manga_tra…" 5 minutes ago Up 5 minutes 0.0.0.0:5003->5003/tcp manga_image_translator_gpu
D:\Environment\manga-image-translator> docker exec -it 59654f5a53b6 /bin/bash
root@59654f5a53b6:/app# pip install openai --upgrade
打开浏览器验证:http://127.0.0.1:5003/
5.使用其他翻译模型 及 第三方GPT来进行翻译
在这里仅限举例deepseek和burn.hair两种不同的例子↓
① api中转站:需要购买 (提供 GPT3.5模型/GPT4模型)
只需重新设置环境变量即可
OPENAI_API_BASE=https://burn.hair/v1
② Deepseek:注册送一个月的免费使用,价格也很便宜 (提供 DeepSeek-V2翻译模型)
Ⅰ 需要修改 chatgpt.py 文件
class GPT35TurboTranslator(GPT3Translator):
…
…
response = await self.client.chat.completions.create(
model='deepseek-chat',
messages=messages,
max_tokens=self._MAX_TOKENS // 2,
temperature=self.temperature,
top_p=self.top_p,
)
…
…
Ⅱ 然后修改docker-compose.yaml文件
version: "3.8"
name: manga_image_translator
services:
manga_image_translator:
image: zyddnys/manga-image-translator:main
container_name: manga_image_translator_gpu
command: --manga2eng -v --mode web --host=0.0.0.0 --port=5003 --translator google --use-gpu
volumes:
- ./result:/app/result
- ./chatgpt.py:/app/manga_translator/translators/chatgpt.py
environment:
- OPENAI_API_KEY=<你的gpt_api_key>
- OPENAI_API_BASE=<你的gpt_api_url>
- SAKURA_API_BASE=<你的sakura_api_rul>
ports:
- 5003:5003
ipc: host
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: "all"
capabilities: ["gpu"]
6.配置使用manga-ocr模型
① 修改docker-compose.yaml文件
version: "3.8"
name: manga_image_translator
services:
manga_image_translator:
image: zyddnys/manga-image-translator:main
container_name: manga_image_translator_gpu
command: --manga2eng -v --mode web --host=0.0.0.0 --port=5003 --translator google --ocr mocr --use-gpu
volumes:
- ./result:/app/result
- ./chatgpt.py:/app/manga_translator/translators/chatgpt.py
environment:
- OPENAI_API_KEY=<你的gpt_api_key>
- OPENAI_API_BASE=<你的gpt_api_url>
- SAKURA_API_BASE=<你的sakura_api_rul>
ports:
- 5003:5003
ipc: host
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: "all"
capabilities: ["gpu"]
② 挂梯子/GPU模式 启动docker 进行翻译 拉取manga-ocr 模型
③ 查看拉取模型后 容器的大小【显示461MB 说明manga_ocr模型已经安装到容器内了】
7.将修改好的容器打包为一个新的镜像方便之后使用
将容器打包并不会将 挂载卷的内容 和 环境变量 打包进去,此时会将容器更新的openai和安装的manga-ocr打包入新镜像中,之后使用这个镜像启动时,就不需要重新更新openai和安装manga-ocr了,否则每次重新构建容器就需要重新安装opanai和manga-ocr,而使用这个新镜像后就不需要了。
如果你不想构建镜像,那么你的容器就不能够删除,更改环境变量 或 更改GPT模型要在你更改好挂载的文件后,通过docker-compose restart来重启容器,来达到更新的效果。
而创建新镜像就可以随便删除容器,更改好变量后直接重构都没问题。
docker ps --all
docker commit <容器id> <镜像名称>
创建的镜像会与原镜像共享资源,可以不删除源镜像
修改docker-compose.yaml启动文件
version: "3.8"
name: manga_image_translator
services:
manga_image_translator:
image: my-manga-image-translator:g1
container_name: manga_image_translator_gpu
command: --manga2eng -v --mode web --host=0.0.0.0 --port=5003 --translator google --ocr mocr --use-gpu
volumes:
- ./result:/app/result
- ./chatgpt.py:/app/manga_translator/translators/chatgpt.py
environment:
- OPENAI_API_KEY=<你的gpt_api_key>
- OPENAI_API_BASE=<你的gpt_api_url>
- SAKURA_API_BASE=<你的sakura_api_rul>
ports:
- 5003:5003
ipc: host
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: "all"
capabilities: ["gpu"]
此时可以删除原本的容器了,然后根据这个新镜像启动这个容器
占用很小…且能够直接使用
8.配置Sakura术语表 和 GPT配置文件
① 项目目录下创建:
keys.py (修改sakura的版本即可)
gpt.cfg (添加gpt配置文件)
sakura_dict.txt (添加sakura词典)
② 在sakura_dict.txt下↓
// 示例字典,可自行添加或修改
安芸倫也->安艺伦也 #名字,男性,学生
倫也->伦也 #名字,男性,学生
安芸->安艺 #姓氏
③ 在gpt.cfg下↓
prompt_template: >
Please help me to translate the following text from a manga to {to_lang}
(if it's already in {to_lang} or looks like gibberish you have to output it as it is instead):\n
temperature: 0.5
top_p: 1
chat_system_template: >
You are a professional translation engine,
please translate the story into a colloquial,
elegant and fluent content,
without referencing machine translations.
You must only translate the story, never interpret it.
If there is any issue in the text, output it as is.
Translate to {to_lang}.
chat_sample:
- <|1|>恥ずかしい… 目立ちたくない… 私が消えたい…
<|2|>きみ… 大丈夫⁉
<|3|>なんだこいつ 空気読めて ないのか…?
- <|1|>好尴尬…我不想引人注目…我想消失…
<|2|>你…没事吧⁉
<|3|>这家伙怎么看不懂气氛的…?
gpt35:
temperature: 0.3
④ 修改docker-compose.yaml文件↓
version: "3.8"
name: manga_image_translator
services:
manga_image_translator:
image: my-manga-image-translator:g1
container_name: manga_image_translator_gpu
command: --manga2eng -v --mode web --host=0.0.0.0 --port=5003 --translator google --ocr mocr --gpt-config "/app/gpt.cfg" --use-gpu
volumes:
- ./result:/app/result
- ./keys.py:/app/manga_translator/translators/keys.py
- ./chatgpt.py:/app/manga_translator/translators/chatgpt.py
- ./sakura_dict.txt:/app/sakura_dict.txt
- ./gpt.cfg:/app/gpt.cfg
environment:
- OPENAI_API_KEY=<你的gpt_api_key>
- OPENAI_API_BASE=<你的gpt_api_url>
- SAKURA_API_BASE=<你的sakura_api_rul>
ports:
- 5003:5003
ipc: host
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: "all"
capabilities: ["gpu"]
9.部署ComicRead阅读环境
可以用来更好的阅读网站上漫画,同时兼容manga-image-translator翻译器,能够更好配置manga-image-translator的翻译环境,方便翻译。
10.全部构建完成后,磁盘空间会被扩大,产生不必要的占用空间,手动清理
① 记录要清理的磁盘路径 D:\Environment\Docker\docker-desktop-data\ext4.vhdx
② wsl —shutdown # 关闭系统
③ wsl -l -v # 查看系统运行情况
④ diskpart # 运行管理计算机的驱动器的 DiskPart 命令
⑤ select vdisk file=“D:\Environment\Docker\docker-desktop-data\ext4.vhdx” # 选择磁盘
⑥ compact vdisk # 压缩磁盘
⑦ detach vdisk # 卸载磁盘
10.5.调试/测试:
① 进入容器的方法
docker ps
docker exec -it 容器ID /bin/bash
② 查看镜像和容器的大小
docker system df -v
10.6.完全卸载Docker和Wsl
① 参考1
首先使用geek删除docker for desktop
然后进入 应用管理 卸载ubantu
然后 wsl --unregister Ubuntu
② 参考2
Windows搜索 ”启用或关闭Windows功能” 并关闭以下功能↓ (需要重启电脑)
10.7.可能会遇到的问题↓
综合问题1.在docker-compose up时,会拉取镜像,此时发生ERROR拉取失败,会产生的镜像占用空间 (此时磁盘被撑大了,需要查看问题2)
综合问题2.删除镜像和容器后,磁盘空间没有减少 (这是因为wsl不会自动收缩磁盘,需要手动操作)
综合问题3.打开docker容器和镜像不见了!
手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数
此时打开docker for desktop
参考1
参考2
是Docker的问题,将docker升级到4.32版本
wsl --unregister docker-desktop-data #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2 #导入数据
11.测试结果参考(仅GPU,CPU来处理会报错)
① 左: CTD+48px+papago / 右: 汉化组
② 左: CTD+manga_ocr+GPT3.5 / 右: 汉化组