/usr/local/bin
目录下的程序,如果启动文件是在这个目录下,在任意位置都可以直接启动,如果启动文件是在子目录下,需要链接一下才能在任意位置启动。在其他位置则需要连接一下才能在任意位置使用。建议在尝试Linux之前首先参考一下相关文献:
参考:
查看系统信息的指令:
cat /proc/version
uname -a
sudo lshw
gnome-shell --version
项目 | 内容 |
---|---|
系统 | Ubuntu 22.04(jammy) |
内存 | 12GiB |
处理器 | Intel® Core™ i5-6300HQ CPU @ 2.30GHz × 4 |
图形 | Intel® HD Graphics 530 & GM107M [GeForce GTX 960M] |
GNOME | GNOME Shell 42.9 |
操作系统类型 | 64位 |
磁盘 | 128GB |
在进行科研工作时,很多时候都需要对代码进行复现。复现很简单,问题的难点在于环境的配置,环境配置好了,实验自然就能够复现,环境配置错误,往往会不停报错。因此为了省去配置环境的麻烦,我们选择把环境连同系统一起打包,即采用docker
,实现快速可迁移的代码复现。
Docker
在电脑上安装Docker
,切记安装的是Docker engine
!!!Docker desktop
-小孩子的玩具,狗都不用(里面功能有缺陷,无法挂载GPU
,还要配合engine
使用才行,官网说desktop
包含engine
,狗屁!害我装了好几遍desktop
配置)!!!,安装Docker engine
参见官网教程。
安装好以后docker帮助命令如下所示。
docker -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
pull Download an image from a registry
push Upload an image to a registry
images List images
login Log in to a registry
logout Log out from a registry
search Search Docker Hub for images
version Show the Docker version information
info Display system-wide information
Management Commands:
builder Manage builds
buildx* Docker Buildx (Docker Inc., v0.11.0)
compose* Docker Compose (Docker Inc., v2.19.1)
container Manage containers
context Manage contexts
dev* Docker Dev Environments (Docker Inc., v0.1.0)
extension* Manages Docker extensions (Docker Inc., v0.2.20)
image Manage images
init* Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.6)
manifest Manage Docker image manifests and manifest lists
network Manage networks
plugin Manage plugins
sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan* Docker Scan (Docker Inc., v0.26.0)
scout* Command line tool for Docker Scout (Docker Inc., 0.16.1)
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Swarm Commands:
swarm Manage Swarm
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
export Export a container's filesystem as a tar archive
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Global Options:
--config string Location of client config files (default
"/home/stu/.docker")
-c, --context string Name of the context to use to connect to the
daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket to connect to
-l, --log-level string Set the logging level ("debug", "info",
"warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default
"/home/stu/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default
"/home/stu/.docker/cert.pem")
--tlskey string Path to TLS key file (default
"/home/stu/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Run 'docker COMMAND --help' for more information on a command.
For more help on how to use Docker, head to https://docs.docker.com/go/guides/
Docker
参考:
#查看本地镜像列表
docker images
名字 | 属性 |
---|---|
REPOSITORY | 表示镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
#查看容器列表
docker ps -a
名字 | 属性 |
---|---|
CONTAINER ID: | 容器 ID。 |
IMAGE | 使用的镜像。 |
COMMAND | 启动容器时运行的命令。 |
CREATED | 容器的创建时间。 |
STATUS | 容器状态。 |
PORTS | 容器的端口信息和使用的连接类型(tcp\udp)。 |
NAMES | 自动分配的容器名称。 |
常见操作指令如下所示:
#拉取镜像
docker pull image_name:version
#以交互式运行容器并初始命令为/bin/bash
docker run -it image_name:version /bin/bash
#退出终端
exit
#启动容器
docker start container_id
#进入容器
docker exec container_id
#停止容器
docker stop container_id
#重启容器
docker restart container_id
#导出容器
docker export container_id > ubuntu.tar
#导入容器
docker import ubuntu.tar test/ubuntu:v1
#删除容器
docker rm -f container_id
#把容器制作为镜像
docker commit -a "author_email" -m "message" container_id image_name:version
#推荐把他整为你docker hub上镜像的形式也就是:image_name=your_repository,version=name_you_set
#把镜像上传到docker hub服务器中
docker push image_id
#或者
docker push image_name:version
#以root身份运行容器并进入bash命令行交互操作
docker exec -it --user root container_id /bin/bash
Docker
容器提供硬件和软件支持一些Docker
容器是即下载即使用的,但是有一些可能需要宿主机的硬件或者软件支持,这些需要不同的套件或者不同的配置。在本文中,我们只讨论了需要宿主机的GPU
硬件支持的容器的使用与配置,主要是pytorch容器。关于软件支持或者网络支持的本文不讨论,我也没弄明白。
ssh
使得可以通过ssh
命令访问容器要想让启动的容器可以通过ssh连接进行访问,就需要在容器中安装ssh服务。当我们需要在云服务器中安装docker容器又想要在外部可以直接访问这个容器而不是先登录服务器然后再打开docker容器,我们可以把docker容器的ssh端口映射到服务器的某个端口上,这样我们可以通过ssh直接访问内部的docker容器。
参考:
在容器内安装ssh
的命令如下所示:
#在容器内安装ssh方便通过ssh访问容器
apt install ssh
#在容器内添加用户密码方便通过ssh登陆时访问
passwd root
123
#容器内修改配置文件,允许用户通过密码登陆root用户
/etc/ssh/sshd_config
PermitRootLogin yes
#重新启动容器内的ssh
/etc/init.d/ssh start %启动ssh
/etc/init.d/ssh stop %关闭ssh
/etc/init.d/ssh restart %重启ssh
#容器内设置端口映射,将容器端口22映射到宿主机的某个端口
#这个操作在vscode中比较容易实现,选择terminal旁边的forward port即可
#其它主机通过ssh连接容器
ssh -p port user@ip
123
#当配置好上述设置以后每次登陆还需要输入密码为了省略上述操作我们可以生成ssh-key,然后把公钥上传到远程服务器的
##/home/hph/.ssh/authorized_keys中
不过这个一般也不怎么用得上,你整个vscode他不香吗?vscode安装一些插件即可。Docker
(Makes it easy to create, manage, and debug container)、Remote-ssh
(Open any folder on a remote machine using SSH)、Dev containers
(Open any folder or repository inside a Docker container)。这样在启动容器以后就可以通过右键容器选择attach visual studio code
来连接容器
pytorch
容器提供GPU
硬件支持参考:
上述最后一个参考还是有可取之处的,==深度学习服务器比较好的管理方式是采用分配账户的方式来提高服务器的利用率。其中cuda最好是通过全局的方式安装到机器上的,也就是所有用户都可以访问,nvidia驱动和cudnn是直接安装在全局上的,这个没什么疑问。Anaconda和pytorch/tensorflow是需要每个用户自行安装的,每个用户根据自己不同的需要安装不同的包。==这就是传统的强化学习环境的配置方式conda
。
深度学习的研究很多都是用pytorch
,所以pytorch
容器的使用很重要。Pytorch
的使用离不开GPU
显卡的加持。在容器中,我们可以通过命令行输入nvidia-smi
的形式来检查我们的容器可不可以访问宿主机上的GPU
。如果你宿主机上正常安装了nvidia driver
,并且你通过nvidia container toolkit
把GPU
显卡挂载到了容器,那么你的容器中是会返回相关信息的。如果上面两个步骤没有完成,是会报错的。下面我们完成这两个步骤。
nvidia driver
有多种方法可以在宿主机中安装nvidia driver
,如果你的服务器有桌面,那么最简单的方式就是打开程序管理器
选择合适的驱动就行。如果没有,要么下载安装包,要么使用apt
包管理器来安装。在使用上述方法安装显卡驱动时,有一些前提要求。
参考:
主要检查的就是有没有显卡,gcc是否安装,以及内核版本和内核头部是否匹配。如果不匹配要安装相应的内核头部。因为有了匹配的内核头部,安装应用程序的时候才能正常通过校验。验证指令如下所示:
#查看GPU是否可以用nvidia的驱动及cuda
lspci | grep -i nvidia
#检查系统版本
uname -m && cat /etc/*release
#检查gcc是否安装了
gcc --version
#查看内核版本
lsb_release -a
uname -a
hostnamectl
cat /proc/version
cat /etc/issue
lsb_release -a
#查看内核头文件的版本
dpkg --get-selections | grep linux 或者 dpkg --list |grep linux
#linux-image-版本号:内核映像文件
#linux-headers-版本号:内核头文件
#linux-image-extra-版本号:内核扩展文件
#最后一步比较复杂,就是要检查内核头文件版本和内核版本是否对应。如果不对应,需要进行修改,
当内核版本跟内核头部文件不匹配时,需要安装相应的内核版本。并修改配置文件使得按照要求的内核运行。
#安装内核版本
sudo apt install linux-image-版本号-generic
#查看配置文件中的内核启动顺序
grep menuentry /boot/grub/grub.cfg
#修改配置文件设置内核启动顺序
sudo gedit /etc/default/grub
#把GRUB_DEFAULT=0修改为 GRUB_DEFAULT=”Ubuntu,Linux 4.4.0-21-generic“ 这种类型的, 当然内核版本应该是你想要的.
#修改完成后更新使生效
sudo update-grub
#再修改配置文件
sudo gedit /boot/grub/grub.cfg
#大概在148行有个........,把版本号改为你需要的版本号,修改好以后保存退出.
#然后重启电脑
#检验是否安装成功
uname -r
当上述要求满足以后就可以按照常见方法中给定的安装步骤进行安装驱动程序。
安装显卡driver的方法参考:
通过程序管理器安装
首先是最简单的通过系统桌面上的additional driver
应用程序来安装驱动。对于Ubuntu系统来说,如果你的计算机有NVIDIA GPU,那么系统会自动安装开源驱动程序 Nouveau 和 NVIDIA专有驱动程序,你可以自己选择,通过桌面上的附加驱动(一块电路板图标)来更改使用的驱动。
默认情况下,Ubuntu 使用的 Nouveau 驱动程序通常比专有驱动程序慢得多,并且不支持最新的硬件和软件技术。所以通过additional driver可以更改GPU使用的驱动程序。
这种方法安装的驱动程序跟通过命令行安装的具有同样效力。通过命令行安装驱动如下所示:
#检查有什么驱动及对应的驱动程序
ubuntu-drivers devices
#安装想使用的版本的驱动
sudo apt install nvidia-driver-版本号
#当然这样安装的是ubuntu软件源默认提供的驱动程序,如果想使用最新的驱动程序,可以从NVIDIA官网上导入PPA来安装。
#重启使生效
sudo reboot
#检查安装情况
nvidia-smi
通过联网在线安装
BASE_URL=https://us.download.nvidia.com/tesla
DRIVER_VERSION=450.80.02
curl -fSsl -O $BASE_URL/$DRIVER_VERSION/NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
sudo sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
通过下载deb包安装
sudo apt-get install linux-headers-$(uname -r)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-drivers
#下载好deb安装包后进行安装
sudo dpkg -i *.deb
在安装完成nvidia driver
后还有一些设置需要完成,包括设置环境变量等,参考:
有一些安装方法是会自动配置环境的。在使用deb
包安装nvidia driver
时,deb
包里面包含了配置环境变量的脚本,所以会自动进行环境变量配置;在使用桌面的程序管理器来切换驱动的时候也支持自动配置环境变量。其他的方法我就不知道了,没试过。
除了上面的常见方法安装nvidia driver
以外,还有另一种安装驱动的方法,就是把他放在容器中,然后安装在电脑上,我也没试,但是还是记下来吧。
通过容器安装驱动
参考:
安装容器版本的驱动程序有一定的要求,包括禁用开源驱动程序,GPU架构,container toolkit的设置,内核模块的开启等,具体检查方法如下所示:
#禁用Nouveau,启用IPMI
#Prompt:ubuntu如何禁用Nouveau?
## 禁用Nouveau
sudo tee /etc/modules-load.d/ipmi.conf <<< "ipmi_msghandler" \
&& sudo tee /etc/modprobe.d/blacklist-nouveau.conf <<< "blacklist nouveau" \
&& sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf <<< "options nouveau modeset=0"
----------------------------------------------------------------------------------------
#查看GPU架构>Fermi(2.1)
## 安装查看GPU的工具
sudo apt install gpustat
##查看GPU的状态、温度、功率、显存使用情况
gpustat
----------------------------------------------------------------------------------------
#设置NVIDIA Container Toolkit for docker为root权限级别,
##根据官方文档中的意思就是:
##先安装好container toolkit,然后修改里面的配置,使得当启动容器时,导入的GPU驱动指向的是驱动容器内的驱动。
##所以container toolkit程序的作用就是设置:当启动容器并挂载GPU时,对应的GPU驱动程序去哪里找?通过修改container toolkit的配置文件可以修改驱动程序的位置,进而让挂载GPU时有不同的位置设置。
##所以我用常见方法安装好驱动以后,要想在容器中使用GPU,也需要下载container toolkit来指定容器去哪里找驱动程序,否则容器无法使用驱动程序。
##设置container toolkit应用程序的权限
sudo sed -i 's/^#root/root/' /etc/nvidia-container-runtime/config.toml
----------------------------------------------------------------------------------------
#启用i2c_core内核模块
## 如果是aws核,需要启用此模块,其他的版本就不用了
sudo tee /etc/modules-load.d/ipmi.conf <<< "i2c_core"
----------------------------------------------------------------------------------------
# 更新使得配置生效
sudo apt-get dist-upgrade
sudo update-initramfs -u
# 重启生效
sudo reboot
在满足上面提到的要求以后,我们可以启动一个驱动容器,也就是专门用来运行驱动程序的容器,
#启动此驱动容器
sudo docker run --name nvidia-driver -d --privileged --pid=host \
-v /run/nvidia:/run/nvidia:shared \
-v /var/log:/var/log \
--restart=unless-stopped \
nvidia/driver:450.80.02-ubuntu18.04
----------------------------------------------------------------------------------------
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
#在驱动容器启动完成后,我们就可以在深度学习容器中挂载GPU了
sudo docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
sudo docker run --gpus all nvidia/cuda:11.8.0-devel-ubuntu22.04 nvidia-smi
sudo apt autoremove
#systemctl --user enable docker-desktop
#service文件位置
#/etc/systemd/system/multi-user.target.wants/docker.service
从官方说明书中知道,安装驱动容器之前要先安装好NVIDIA-Container-Toolkit
,在我这个教程中,安装nvidia container toolkit
是第二步,所以我们不细说这种容器安装驱动的方式,如果要尝试这种安装方式的话,需要倒着看,先看怎么安装nvidia container toolkit
,再回过头来看配置安装驱动。
nvidia container toolkit
安装这个应用程序也有前提要求,我之前(2023.09.03)看的时候说要先安装NVIDIA驱动程序,再来安装这个toolkit,现在(2023.10.07)再看就没了这个要求,估计是开发人员发现了这个智障问题:前面我们说了,要安装容器驱动,就需要先安装nvidia container toolkit
,但是要安装nvidia container toolkit
又需要先安装驱动,这不闭环了嘛。我安装驱动,你让我先安装toolkit,我安装toolkit,你说先安装驱动,锁死了。好在现在再来看这个安装就没了这个要求。要求如下所示NVIDIA:Installation Guide:
#kernel version > 3.10
uname -a
----------------------------------------------------------------------------------------
#Docker >=19.03
docker -v
----------------------------------------------------------------------------------------
#GPU architecture >=Kepler
gpustat
----------------------------------------------------------------------------------------
#NVIDIA driver >=418.81.07
nvidia-smi
当我们的宿主机能够满足这些要求以后,我们可以进行安装并将其配置到其他应用上,使得其他应用能够借助于这个nvidia container toolkit
来访问GPU
。
比如:可以用于Container Device Interface (CDI) Support这个应用Github:CDI - The Container Device Interface,也可以用于Docker这个应用Installing the NVIDIA Container Toolkit。
Docker
安装参考:
nvidia container toolkit
具体的安装过程也非常简单,针对不同的系统有不同的方式,Ubuntu
系统使用apt
包管理器即可。
参考:
#设置gpg-key
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& 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/$distribution/libnvidia-container.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
#配置container-toolkit的守护进程
sudo nvidia-ctk runtime configure --runtime=docker
##上面的命令在你正常安装docker engine和nvidia driver的时候是正常可用的!下面注释掉的是没用的
#sudo dockerd --add-runtime=nvidia=/usr/bin/nvidia-container-runtime [...]
##或者
#sudo mkdir -p /etc/systemd/system/docker.service.d
#sudo tee /etc/systemd/system/docker.service.d/override.conf <
#[Service]
#ExecStart=
#ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
#EOF
#sudo systemctl daemon-reload \
# && sudo systemctl restart docker
#重启docker
sudo systemctl restart docker
#如果提示:Failed to restart docker.service: Unit docker.service is masked.
#说明你之前安装的docker engine或者nvidia driver不正确,建议检查一下。
#通过运行基本的CUDA容器来验证工作设置
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
通过上面的命令我们就实现了安装Nvidia container toolkit
,并将它配置给了docker
应用,使得docker
容器通过上面的运行命令可以访问宿主机上的GPU
。
1.下面报错是因为我之前一直安装的是docker desktop
,不知道犯什么神经,没有docker daemon
。需要安装docker engine才是正确的。
上面反复错误就是因为我用的是Docker desktop,导致缺少docker.service文件,连systemctl都找不到docker.service在哪里,更开不了守护进程daemon。
如果还有问题可以参考:
2.如果正常安装docker engine
以后执行docker
相关命令提示permission
问题,就是用户权限问题,说明你当前用户不是docker
组里面的用户,我们要把用户添加到docker
组里面。命令如下:
sudo gpasswd -a <当前登陆用户名> docker
### 例如: sudo gpasswd -a xuxiaocong docker
### 从用户组中删除: sudo gpasswd -d <当前登陆用户名> docker
##链接上以后,再添加三个拓展,然后再重启就可以使用docker了
sudo reboot
参考:
3.卸载Docker desktop
的步骤
# 卸载客户端
sudo apt purge docker-desktop
# 删除配置文件
rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
# 删除无用的软链接
cd /etc/systemd/system/multi-user.target.wants
# 把其中标红的删掉
4.启动pytorch
容器并挂在GPU
# 查看系统内版本
#uname -a不行
cat /etc/issue
# 拉取python镜像
docker pull python:3.11@sha256:7d57b1fef9b7fda8bf331b971a3ca96c3214313666fafdf26d33f1d0e6399222
# 运行python容器
docker run -it --runtime=nvidia --gpus all --name python3-test python:3.11@sha256:7d57b1fef9b7fda8bf331b971a3ca96c3214313666fafdf26d33f1d0e6399222
# 拉取ubuntu镜像
docker pull ubuntu:jammy-20230624@sha256:b060fffe8e1561c9c3e6dea6db487b900100fc26830b9ea2ec966c151ab4c020
# 运行ubuntu容器
docker run -it --runtime=nvidia --gpus all --name ubuntu-test ubuntu:jammy-20230624@sha256:b060fffe8e1561c9c3e6dea6db487b900100fc26830b9ea2ec966c151ab4c020
#拉取Pytorch镜像
docker pull bitnami/pytorch:2.0.1
# 启动pytorch容器
docker run -it --runtime=nvidia --gpus all --name pytorch-test bitnami/pytorch:2.0.1
# 拉取18.0镜像
docker pull ubuntu:bionic-20230530@sha256:dca176c9663a7ba4c1f0e710986f5a25e672842963d95b960191e2d9f7185ebe
# 拉取正版pytorch镜像
docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel
# 运行正版pytorch镜像
docker run -itd --gpus all --name myenv pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel
Docker官方收了多少广告费,搜索Pytorch竟然第一个不是Pytorch社区开发的Pytorch镜像包,而是bitnami下面的。要是能用我就不说什么了,关键还不好用。按下载量排名也轮不上bitnami啊。
真正的pytorch镜像应该是:
参考:
狗官方,要是搜索直接显示社区版本的,我也就不用走这么多弯路了,真狗!!!