Archive

Archive for April, 2020

Nvidia CUDA开发环境 Docker容器启用显卡

April 28th, 2020 No comments

Nvidia CUDA开发环境 Docker容器启用显卡

1.准备docker>19.03 环境,配置好nvidia-container-toolkit
2.确定本机已安装的显卡驱动版本,匹配需要的容器版本
3.Pull基础docker镜像,可以从官方或者dockerhub下载
https://ngc.nvidia.com/catalog/containers/nvidia:cuda/tags
https://gitlab.com/nvidia/container-images/cuda

cuda10-py36-conda的Dockerfile

FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
MAINTAINER Limc <limc@limc.com.cn>
 
#close frontend
ENV DEBIAN_FRONTEND noninteractive
 
# add cuda user
# --disabled-password = Don't assign a password
# using root group for OpenShift compatibility
ENV CUDA_USER_NAME=cuda10
ENV CUDA_USER_GROUP=root
 
# add user
RUN adduser --system --group --disabled-password --no-create-home --disabled-login $CUDA_USER_NAME
RUN adduser $CUDA_USER_NAME $CUDA_USER_GROUP
 
# Install basic dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        cmake \
        git \
        wget \
        libopencv-dev \
        libsnappy-dev \
        python-dev \
        python-pip \
        #tzdata \
        vim
 
# Install conda for python
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh
 
# Set locale
ENV LANG C.UTF-8 LC_ALL=C.UTF-8
 
ENV PATH /opt/conda/bin:$PATH
 
RUN ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh  && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc && \
    find /opt/conda/ -follow -type f -name '*.a' -delete && \
    find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
    /opt/conda/bin/conda clean -afy
 
 
# copy entrypoint.sh
#COPY ./entrypoint.sh /entrypoint.sh
# install 
#ENTRYPOINT ["/entrypoint.sh"]
 
# Initialize workspace
COPY ./app /app
# make workdir
WORKDIR /app
 
# update pip if nesseary
#RUN pip install --upgrade --no-cache-dir pip
# install gunicorn
# RUN pip install --no-cache-dir -r ./requirements.txt
 
# install use conda
#RUN conda install --yes --file ./requirements.txt
RUN while read requirement; do conda install --yes $requirement; done < requirements.txt
 
 
# copy entrypoint.sh
COPY ./entrypoint.sh /entrypoint.sh
# install 
ENTRYPOINT ["/entrypoint.sh"]
 
# switch to non-root user
USER $CUDA_USER_NAME

运行容器Makefile

 
IMG:=`cat Name`
GPU_OPT:=all
MOUNT_ETC:=
MOUNT_LOG:=
MOUNT_APP:=-v `pwd`/work/app:/app
MOUNT:=$(MOUNT_ETC) $(MOUNT_LOG) $(MOUNT_APP)
EXT_VOL:=
PORT_MAP:=
LINK_MAP:=
RESTART:=no
CONTAINER_NAME:=docker-cuda10-py36-hello
 
echo:
    echo $(IMG)
 
run:
    docker rm $(CONTAINER_NAME) || echo
    docker run -d --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP) --restart=$(RESTART) \
                         $(EXT_VOL) $(MOUNT) $(IMG)
 
run_i:
    docker rm $(CONTAINER_NAME) || echo
    docker run -i -t --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP) \
                         $(EXT_VOL) $(MOUNT) $(IMG) /bin/bash 
 
exec_i:
    docker exec -i -t --name $(CONTAINER_NAME)  /bin/bash 
 
stop:
    docker stop $(CONTAINER_NAME)
 
rm: stop
    docker rm $(CONTAINER_NAME)

Entrypoint.sh

set -e
 
# Add python as command if needed
if [ "${1:0:1}" = '-' ]; then
    set -- python "$@"
fi
 
# Drop root privileges if we are running gunicorn
# allow the container to be started with `--user`
if [ "$1" = 'python' -a "$(id -u)" = '0' ]; then
    # Change the ownership of user-mutable directories to gunicorn
    for path in \
        /app \
        /usr/local/cuda/ \
    ; do
        chown -R cuda10:root "$path"
    done
 
    set -- su-exec python "$@"
    #exec su-exec elasticsearch "$BASH_SOURCE" "$@"
fi
 
# As argument is not related to gunicorn,
# then assume that user wants to run his own process,
# for example a `bash` shell to explore this image
exec "$@"

几个注意点
1.显卡运行需要root用户权限,否则会出现以下,
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345
考虑安全性可以在容器内创建新用户并加入到root组
2.本机显卡驱动和CUDA必须匹配官方容器的版本,cudnn则不需要匹配,可以使用多个不同版本的cudnn,但是必须满足显卡要求的使用范围
3.docker运行容器非正常结束时会占用显卡,如果卡死,会造成容器外部无法使用,重启docker-daemon也无效,这时只能重启电脑

完整的源代码
https://github.com/limccn/ultrasound-nerve-segmentation-in-tensorflow/commit/d7de1cbeb641d2fae4f5a78ff590a0254667b398

参考
https://gitlab.com/nvidia/container-images/cuda

Categories: 系统管理, 语言编程 Tags:

[docker]升级docker19.03使用nvidia-container-toolkit

April 9th, 2020 No comments

升级docker19.03使用nvidia-container-toolkit

docker升级到19.03以后,nvidia将提供原生的显卡支持,只需要安装
nvidia-container-toolkit工具包即可,
不再像使用nvidia-docker/2那样复杂配置,而且不支持用docker-compose

安装步骤
1.确认本机nvidia驱动安装正确,cuda和cudnn配置正常,官方文档说可以不需要在host配置cuda,
2.安装docker,可以参考,主要安装19.03以后的版本
https://docs.docker.com/engine/install/ubuntu/
3.添加nvidia-docker的源

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

4.使用以下命令安装nvidia-container-toolkit,重启docker

sudo apt-get install -y nvidia-container-toolkit
#restart docker
sudo systemctl restart docker

5.如果本机已安装nvidia-docker2,可以单独完成安装nvidia-container-toolkit,且相互不影响,
官方虽然已经宣布nvidia-docker2 deprecated了,但是继续使用是没问题的

使用上的主要区别
使用nvidia-container-toolkit

#使用nvidia-container-toolkit
docker run --gpus "device=1,2"

使用nvidia-docker2

#使用nvidia-docker2,已deprecated,但是还能继续用
docker run --runtime=nvidia

使用nvidia-docker

#使用nvidia-docker
nvidia-docker run

几个坑
1. nvidia-container-toolkit和nvidia-docker2的容器image位置不一样且不通用,如果要混用,需要根据需要选择不同版本的容器
2.nvidia-container-toolkit的多显卡支持目前测试没成功,容器跑最好还是单个显卡吧。可能跟host配置有关

参考
https://docs.nvidia.com/deeplearning/frameworks/user-guide/index.html
https://docs.nvidia.com/ngc/ngc-aws-setup-guide/running-containers.html#preparing-to-run-containers
https://github.com/NVIDIA/nvidia-docker
https://nvidia.github.io/nvidia-docker/

Categories: 系统管理 Tags:

H3C 华三交换机配置物理隔离端口

April 8th, 2020 No comments

对于只需要经过uplink连接外网,不需要跟交换机内其他端口交换的端口,可以通过隔离端口组方式实现二层物理隔离。

VLAN-1020 10.20.0.0/16 eg1/0/17-eg1/0/18 access

注意:
1.一个端口只能加入到一个端口隔离组
2.不会隔离经由trunk/uplink的交换

1.创建端口隔离组
# 切换系统视图
sys
# 创建物理隔离端口组
[H3C] port-isolate group 1
#切换到GigabitEthernet1/0/17
[H3C] interface GigabitEthernet 1/0/17
#加入端口隔离组1
[H3C-GigabitEthernet1/0/17]port-isolate enable group 1
#打开端口
[H3C-GigabitEthernet1/0/17]undo shutdown
#完成
[H3C-GigabitEthernet1/0/17]quit

#切换到GigabitEthernet1/0/18
[H3C] interface GigabitEthernet 1/0/18
#加入端口隔离组1
[H3C-GigabitEthernet1/0/18]port-isolate enable group 1
#打开端口
[H3C-GigabitEthernet1/0/18]undo shutdown
#完成
[H3C-GigabitEthernet1/0/18]quit

2.管理
#查看端口隔离组
[H3C] display port-isolate group 1

Categories: 系统管理 Tags:

[CENTOS]使用cosfs挂载腾讯云COS到VPS服务器上

April 2nd, 2020 No comments

[CENTOS]使用cosfs挂载腾讯云COS到VPS服务器上

事前准备
1.准备好用于挂载的Bucket,配置好权限
2.获得可以用于挂载Bucket,accesskey和secret

腾讯官方Cosfs的地址
https://github.com/tencentyun/cosfs/

1.下载cosfs的安装包

Wget https://github.com/tencentyun/cosfs/releases/download/v1.0.14/cosfs-1.0.14-centos7.0.x86_64.rpm

2.本地安装

sudo yum localinstall cosfs-1.0.14-centos7.0.x86_64.rpm

3.配置访问
将Bucket名称以及具有此Bucket访问权限的AccessKeyId/AccessKeySecret信息存放在/etc/passwd-cosfs文件中。注意这个文件的权限必须正确设置,建议设为640。

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-cosfs
chmod 640 /etc/passwd-cosfs

4.将Bucket挂载到指定目录。
# 读取

Cosfs my-bucket my-mount-point -ourl=my-cos-endpoint

# 777权限方式

Cosfs my-bucket my-mount-point -ourl=my-cos-endpoint -oallow_other

5.卸载已挂载的磁盘

fusermount -u my-mount-point

几个坑
1.如果当远程硬盘用,允许非Root用户和其他用户读写,需要加-oallow_other,
2.cosfs 会扫描cos里面的文件内容,如果文件比较多,还是避免ls,find之类的操作。
3.不建议使用fstab方式开机启动,可能会让你的vps无法重启

参考
https://cloud.tencent.com/document/product/436/6883

Categories: 系统管理 Tags:

[CENTOS]使用ossfs挂载aliyun OSS到VPS服务器

April 2nd, 2020 No comments

[CENTOS]使用ossfs挂载aliyun OSS到VPS服务器

事前准备
1.准备好用于挂载的Bucket,配置好权限
2.获得可以用于挂载Bucket,accesskey和secret

1.下载安装ossfs安装包

wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm

2.本地安装

sudo yum localinstall ossfs_1.80.6_centos7.0_x86_64.rpm

3.配置访问
将Bucket名称以及具有此Bucket访问权限的AccessKeyId/AccessKeySecret信息存放在/etc/passwd-ossfs文件中。注意这个文件的权限必须正确设置,建议设为640。

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

4.将Bucket挂载到指定目录。

# 非共享
ossfs my-bucket my-mount-point -ourl=my-oss-endpoint
# 777权限方式,非root用户可以用
ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -o allow_other

5.卸载已挂载的
fusermount -u my-mount-point

几个坑
1.如果要支持写入,并且控制文件权限,用户必须对Bucket有完全控制权限,否则下次挂载以后权限配置丢失。
2.如果当远程硬盘用,允许非Root用户和其他用户读写,需要加-o allow_other,
3.大文件上传会在OSS Bucket存储碎片,尽量减少大文件的传送,内网再快也是有延迟的。
4.流方式或者低级别的磁盘读写会直接卡死OSS,比如dd命令。毕竟不是真硬盘。
5.ossfs 会扫描oss里面的文件内容,如果文件比较多,还是避免ls,find之类的操作。
6.不建议使用fstab方式开机启动,可能会让你的vps无法重启

参考
https://help.aliyun.com/document_detail/153892.html?spm=a2c4g.11186623.6.750.2b03142bM5YPG3

Categories: 系统管理 Tags:

H3C华三交换机配置Vlan,使用简单的单臂模式

April 2nd, 2020 No comments

H3C华三交换机配置Vlan,使用简单的单臂模式

VLAN配置一览
VLAN-1 0.0.0.0/0 default
VLAN-10 10.0.0.0/8 eg1/0/23 eg1/0/24 trunk uplink bridge-aggregation
VLAN-31 172.16.0.0/16 eg1/0/1-eg1/0/4 access
VLAN-32 172.17.0.0/16 eg1/0/5-eg1/0/8 access
VLAN-410 192.168.100.0/24 eg1/0/9-eg1/0/12 access
VLAN-420 192.168.200.0/24 eg1/0/13-eg1/0/16 access
VLAN-999 10.0.99.0/24 eg1/0/22 access manage

1.创建链路汇聚上行口
# 切换系统视图
sys
# 创建链路汇聚接口,id=1
[H3C] interface bridge-aggregation 1
# 设置汇聚类型为动态, mode默认为static
[H3C-Bridge-Aggregation1] link-aggregation  mode static | dynamic
# 设置为trunk上行主干
[H3C-Bridge-Aggregation1] port link-type trunk
# 设置允许所有vlan上行
[H3C-Bridge-Aggregation1] port trunk permit vlan all

#切换到GigabitEthernet1/0/25
[H3C-Bridge-Aggregation1] interface GigabitEthernet 1/0/25
# 设置为trunk上行主干
[H3C-GigabitEthernet1/0/25]port link-type trunk
# 设置允许所有vlan上行
[H3C-GigabitEthernet1/0/25]port trunk permit vlan all
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/25]port link-aggregation group 1

#切换到GigabitEthernet1/0/26
[H3C-GigabitEthernet1/0/25] interface GigabitEthernet 1/0/26
# 设置为trunk上行主干
[H3C-GigabitEthernet1/0/26]port link-type trunk
# 设置允许所有vlan上行
[H3C-GigabitEthernet1/0/26]port trunk permit vlan all
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/26]port link-aggregation group 1
#配置完成 退出
[H3C-GigabitEthernet1/0/26]quit

2.创建和配置vlan
# 启用vlan
[H3C] vlan enable

#创建和配置vlan10
[H3C] vlan 10
#加入接口
[H3C-vlan10] port GigabitEthernet 1/0/23 to GigabitEthernet 1/0/24
#完成
[H3C-vlan10] quit

#创建和配置vlan31
[H3C] vlan 31
#加入接口
[H3C-vlan31] port GigabitEthernet 1/0/1 to GigabitEthernet 1/0/4
#完成
[H3C-vlan31] quit

#创建和配置vlan32
[H3C] vlan 32
#加入接口
[H3C-vlan32] port GigabitEthernet 1/0/5 to GigabitEthernet 1/0/8
#完成
[H3C-vlan32] quit

#创建和配置vlan410
[H3C] vlan 410
#加入接口
[H3C-vlan410] port GigabitEthernet 1/0/9 to GigabitEthernet 1/0/12
#完成
[H3C-vlan410] quit

#创建和配置vlan420
[H3C] vlan 420
#加入接口
[H3C-vlan420] port GigabitEthernet 1/0/13 to GigabitEthernet 1/0/16
#完成
[H3C-vlan420] quit

3.配置管理用vlan,网关10.0.99.254,本机IP10.0.99.253
#创建和配置vlan999
[H3C] vlan 999
#加入接口
[H3C-vlan999] port GigabitEthernet 1/0/22
#清除管理端ip
[H3C-vlan999]undo ip address
#创建管理端口到ip为10.0.99.253
[H3C-vlan999] ip address 10.0.99.253 255.255.255.0
#管理接口vlan为999
[H3C-vlan999] management-vlan 999
#完成
[H3C-vlan999] quit

4.管理本地用户
[H3C]local-user admin
#开启telnet
[H3C-luser-admin]service-type telnet
#管理密码
[H3C-luser-admin]password simple admin
#安全加密
[H3C-luser-admin]super password level 3 cipher admin
#完成
[H3C-luser-admin] quit

5.启用web管理
[H3C]ip http enable

#完成并保存
[H3C]save

#显示Vlan
[H3C] display vlan

Categories: 系统管理 Tags:

H3C 华三交换机配置光口双线链路聚合

April 2nd, 2020 No comments

两台H3C华三交换机交换机配置双线链路聚合

链路模式
Switch-A <==trunk==> Switch-B

0.事前准备
准备好串口转RJ45连接线,连接电脑与交换机的console口

1.使用串口软件连接到交换机的console口
连接参数可以参考交换机的说明书,H3C的参数如下:
波特率(Baud rate) = 9600
数据位(Data) = 8bits
校验位(Parity) =None
停止位(Stop) = 1bit
流 控(Flow control) = 0

连接软件可以用HyperTerminal、TeraTerm

2.在交换机Switch-A上完成命令,uplink用的物理端口为ge1/0/25和ge1/0/26
# 切换系统视图
sys
# 创建链路汇聚接口,id=1
[H3C] interface bridge-aggregation 1
# 设置汇聚类型为动态, mode默认为static
[H3C-Bridge-Aggregation1] link-aggregation  mode static | dynamic
# 设置为trunk上行主干
[H3C-Bridge-Aggregation1] port link-type trunk
# 设置允许所有vlan上行
[H3C-Bridge-Aggregation1] port trunk permit vlan all

#切换到GigabitEthernet1/0/25
[H3C-Bridge-Aggregation1] interface GigabitEthernet 1/0/25
# 设置为trunk上行主干
[H3C-GigabitEthernet1/0/25] port link-type trunk
# 设置允许所有vlan上行
[H3C-GigabitEthernet1/0/25] port trunk permit vlan all
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/25] port link-aggregation group 1

#切换到GigabitEthernet1/0/26
[H3C-GigabitEthernet1/0/25] interface GigabitEthernet 1/0/26
# 设置为trunk上行主干
[H3C-GigabitEthernet1/0/26] port link-type trunk
# 设置允许所有vlan上行
[H3C-GigabitEthernet1/0/26] port trunk permit vlan all
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/26] port link-aggregation group 1
#配置完成 退出
[H3C-GigabitEthernet1/0/26] quit
保存
[H3C] save

3.在交换机Switch-B上完成命令,使用物理端口为ge1/0/27和ge1/0/28
# 切换系统视图
sys
# 创建链路汇聚接口,id=1
[H3C] interface bridge-aggregation 1
# 设置汇聚类型为static
[H3C-Bridge-Aggregation1] link-aggregation  mode static
#切换到GigabitEthernet1/0/27
[H3C-Bridge-Aggregation1] interface GigabitEthernet 1/0/27
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/27]port link-aggregation group 1
#切换到GigabitEthernet1/0/28
[H3C-GigabitEthernet1/0/27] interface GigabitEthernet 1/0/28
#加入到链路汇聚组1
[H3C-GigabitEthernet1/0/28] port link-aggregation group 1
#配置完成 退出
[H3C-GigabitEthernet1/0/28] quit
#保存
[H3C] save

聚合端口的管理命令
#查看所有聚合端口的详细信息,可以使用brief参数
[H3C] display interface bridge-aggregation 
#查看指定聚合端口的详细信息,可以使用brief参数
[H3C] display interface bridge-aggregation 1

其他命令
#查看所有接口
[H3C] display interface brief
#查看光口信息
[H3C] display transceiver interface 

https://jingyan.baidu.com/article/574c52197882bf6c8c9dc155.html
https://blog.csdn.net/jason_deng_2017/article/details/78775169

Categories: 系统管理 Tags: