说明

原来使用过各种方法装过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

重启了一下就好了

docker pull 制品库 docker pull invalid reference format_ubuntu

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

docker pull 制品库 docker pull invalid reference format_ubuntu_02

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 &

然后就好了。

docker pull 制品库 docker pull invalid reference format_bash_03