说明
原来使用过各种方法装过CUDA环境,最简单的显然是在本机装好驱动后直接拉取支持gpu的docker镜像,然后开始使用。
内容
小插曲:
先是运行的好好的,碰到一个问题。之前应用显卡的程序还在跑,我看到这个提示以后重启了一下kernal就干脆起不来了。
└─ $ nvcc -c
nvcc fatal : No input files specified; use option --help for more information
# 但是还是可以查看显卡的型号的
└─ $ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C04sv000010DEsd00001C04bc03sc00i00
vendor : NVIDIA Corporation
model : GP106 [GeForce GTX 1060 5GB]
driver : nvidia-driver-418-server - distro non-free
driver : nvidia-driver-390 - distro non-free
driver : nvidia-driver-450 - distro non-free
driver : nvidia-driver-460 - distro non-free
driver : nvidia-driver-450-server - distro non-free
driver : nvidia-driver-460-server - distro non-free recommended
driver : xserver-xorg-video-nouveau - distro free builtin
重启了一下就好了
1 关于驱动
查看驱动
# 1 查看是否启动集成显卡,正常应该无输出
lsmod | grep nouveau
# 2 查看显卡的型号
ubuntu-drivers devices
清除驱动,万一要重装的话
apt-get remove –purge nvidia*
安装驱动
# 选择合适的驱动安装,注意安装的驱动版本的名称格式可能会稍有变化
# ubuntu-drivers autoinstall
apt install nvidia-430
使用镜像的好处是:只要驱动正常,CUDA和Cudnn就不要自己配了
。
2 GPU镜像
如何制作镜像参考这篇文章 如何将镜像推送到公网仓库参考这篇文章
2.1 查找/查看镜像
拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/andy08008/pytorch_jupyter:[镜像版本号]
检查,镜像大概5个G
docker images
2.2 启动容器
- 1 是不是一个服务? 如果是服务的话,那么就要通过端口映射将主机的端口投射到容器端口。
- 2 需不需要持久化存储/访问?如果需要读取或者把文件写在主机上,就要通过数据卷的映射,把主机的文件夹映射到容器
- 3 因为是调用gpu的容器,因此和普通的容器相比,需要加上 --gpus all (可以理解为 graphic card pass all to docker)。好像也可以选择只映射一张卡进去 ,反正我就一张,不琢磨了。
我先启动一个镜像,但是没有做什么操作
docker run -idt -v /home:/home --gpus all b87f3e56ca55 bash
然后通过exec的方法进去(不要通过attach,否则退出时会同时停止容器)
docker exec -it b1b436551971 bash
打开发现有中文乱码问题
step1:
apt-get install language-pack-zh-hans
apt-get install fonts-droid-fallback ttf-wqy-zenhei ttf-wqy-microhei fonts-arphic-ukai fonts-arphic-uming
cd /etc/profile.d/ && vim zzy.sh
粘贴一下
export LANG=en_US.UTF-8
export LANGUAGE=
export LC_CTYPE="en_US.UTF-8"
export LC_NUMERIC=zh_CN.UTF-8
export LC_TIME=zh_CN.UTF-8
export LC_COLLATE="en_US.UTF-8"
export LC_MONETARY=zh_CN.UTF-8
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER=zh_CN.UTF-8
export LC_NAME=zh_CN.UTF-8
export LC_ADDRESS=zh_CN.UTF-8
export LC_TELEPHONE=zh_CN.UTF-8
export LC_MEASUREMENT=zh_CN.UTF-8
export LC_IDENTIFICATION=zh_CN.UTF-8
export LC_ALL=
step2:
vim ~/.bashrc
export LANG=LANG="zh_CN.utf-8"
export LANGUAGE="zh_CN:zh:en_US:en"
export LC_ALL="zh_CN.utf-8"
source ~/.bashrc
然后就好了。
但是终端还是没办法输入中文,我参照了一些帖子,放弃了(获取未来可以使用别的shell)。好在ipython里面使用中文还是没有问题的。
首先要从Ubuntu语言设置那里,把中文语言包安装上
打开/etc/environment
在下面添加如下两行
LANG=”zh_CN.UTF-8″
LANGUAGE=”zh_CN:zh:en_US:en”
打开 /var/lib/locales/supported.d/local
添加zh_CN.GB2312字符集,如下:
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN GB2312
保存后,执行命令:
sudo locale-gen
打开/etc/default/locale
修改为:
LANG=”zh_CN.UTF-8″
LANGUAGE=”zh_CN:zh:en_US:en”
2.2 安装包
如果还有一些其他的需要安装的包
pip install transformers -i https://mirrors.aliyun.com/pypi/simple/
2.3 准备执行文件
m1_worker.py,第一次只跑了一个小批次的
要特别注意用显卡计算时,模型,变量都要在同一个设备,之前搬的时候漏掉了,我还以为是驱动的问题。(卸了半天也没卸掉,还好哈哈)
import pandas as pd
from func_dict_m1 import LittleMongo2, FuncDict1
from func_dict_m1 import lmongo as func_lmongo
import time
cur_func_dict = FuncDict1('indus_mark', pack_fpath= './funcs_electra_gpu/' ,lmongo=func_lmongo)
fs = cur_func_dict.fs
pack_name = 'pack_0045000000'
# 模型初始设置
model_checkpoint = './model_v0/'
label_list = ['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC', 'B-T', 'I-T']
max_len = 200
import torch
import transformers
from transformers import AutoTokenizer, AutoModelForTokenClassification
# Setting up the device for GPU usage
from torch import cuda
device = 'cuda' if cuda.is_available() else 'cpu'
print('device available', device)
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
assert isinstance(tokenizer, transformers.PreTrainedTokenizerFast)
model = AutoModelForTokenClassification.from_pretrained(model_checkpoint, num_labels=len(label_list))
from functools import partial
tencoder = partial(tokenizer.encode,truncation=True, max_length=max_len, is_split_into_words=True, return_tensors="pt")
_ = model.cuda()
# 定义步
the_flipflop = fs.FlipFlop('gpu_process')
the_flipflop.flip(fs.gpu_process_flip, './%s/' % pack_name,'data_',fs,fetchnum = 10, batch_size = 4000,
model=model,tencoder=tencoder, label_list=label_list)
the_flipflop.flop(fs.gpu_process_flop,fs)
# 执行步(不定次)
@fs.run_until_done_father(10)
def go_process():
return the_flipflop.flipflop_runtime()
go_process()
2.4 将测试好的容器重新发布为新的镜像
docker commit b1b436551971 registry.cn-hangzhou.aliyuncs.com/andy08008/pytorch_jupyter:v3
docker push registry.cn-hangzhou.aliyuncs.com/andy08008/pytorch_jupyter:v3
2.5 开始正式的执行任务
说来也逗,再进入容器中文已经正常了,我都不知道怎么回事
nohup python3 m1_worker.py >/dev/null 2>&1 &
然后就好了。