服务器的配置和使用

深度学习环境配置包括 显卡驱动 + anaconda + cuda + cudnn + pytorch/tensorflow(GPU版)

它们之间的关系如下:

cuda版本与显卡驱动有关,在这里可查看二者的版本关系

cudnn与cuda版本有关,在这里可查看二者的版本关系

pytorch与cuda版本有关,在这里可查看二者的版本关系

tensorflow和gcc、cuda版本有关,在这里可查看它们的版本关系

因为实验室的服务器已经有同学在使用所以基本环境都已装好,只需在anaconda中创建一个新的虚拟环境安装pytorch/tensorflow即可,这样更方便更安全,避免和其他同学的环境产生冲突。所以这里也只记录了在显卡驱动、anaconda、cuda、cudnn都已装好的服务器中,第一次使用前所需要做的准备。

(由于笔记本使用win10系统,实验室台式机使用Linux系统,所以文中图片可能会出现两种系统下的截图,但两种系统下的方法是一样的)。在Windows系统中使用xshell远程连接服务器,Linux系统在终端或VsCode中可远程连接服务器。

一、了解服务器基本信息

1、硬盘大小及剩余容量

df -lh

2、显卡信息

lspci | grep -i nvidialspci | grep -i vga

3、显卡驱动

nvidia-smi

nvidia-smi

4、查看cuda版本

nvcc -V

nvcc

5、查看cudnn版本

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

6、查看gcc版本

gcc -v

二、在Anaconda中创建个人环境

1、创建新环境

conda create -n xwj_pytorch python=3.6

2、进入环境

conda activate xwj_pytorch

activate

3、在虚拟环境中安装pytorch

官网查找对应cuda的pytorch版本

pytorch

复制命令在终端执行,即可完成安装

installpytorch

进入虚拟环境中的python,检查pytorch是否安装成功是否可用

checkpytorch

pytorch中可通过如下代码查看可用显卡的数量和信息

import torch
print([torch.cuda.get_device_properties(i) for i in range(torch.cuda.device_count())])

pytorch中设置可用显卡

import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0,1'

4、安装tensorflow

查看gcc版本 gcc -v

gcc

tensorflow官网查看版本匹配

tfversion

为了避免和其他环境中的模块版本产生冲突,可按照1、2步骤重新创建一个新的虚拟环境,并进入该虚拟环境

创建环境 conda create -n xwj_tensorflow python=3.6

进入环境 conda activate xwj_tensorflow

activatetf

安装GPU版tensorflow conda install tensorflow-gpu==2.0.0

installtf

参照3中的方法进入虚拟环境的python,检查tensorflow是否安装成功,是否可用

三、VsCode的使用

可以使用Pycharm或Vscode作为本地的python代码编辑器。因为还要远程连接服务器,而Pycharm中只有pro版有此功能,虽然可以使用学生身份申请免费使用pro版,但是为了方便这里直接用vscode。下面列出了使用vscode时遇到的一些问题。

1、在vscode中使用anaconda环境里的python解释器无效

vscode中可点击左下角选择python解释器。在确保已前面步骤都正确,但是选择anaconda中已安装好的pytorch虚拟环境里的python解释器后,运行代码时仍出现如下报错

nomodule

解决:在setting.json文件中注释掉原来的 python.pythonPath,添加如下代码,其中第七项 “python” 更改为anaconda中虚拟环境里python的路径

{
    // "python.pythonPath": "/home/lab406/anaconda3/envs/pytorch/bin/python"
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "~/anaconda3/envs/pytorch/bin/python",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        "csharp": "scriptcs",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "scheme": "csi -script",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run",
        "lisp": "sbcl --script",
        "kit": "kitc --run",
        "v": "v run",
        "sass": "sass --style expanded",
        "scss": "scss --style expanded"
    },
    "code-runner.runInTerminal": false
}

保存后再次运行如下代码

checkvscode

可正常使用了(若依然无法使用则重新启动VsCode即可)

vscodenormal

2、在vscode中远程连接服务器

首先在vscode中安装 Remote - SSH 插件

remotessh

点击Configure图标,选择ssh配置

configssh

输入主机名称(自定义)、主机IP、用户名、端口号(可选)

sshinfo

点击该主机名,右键可选择在当前窗口或新窗口连接服务器

connecthost

然后输入密码登录服务器

hostpassword

3、同步本地代码到服务器

(1)安装SFTP插件

sftp

(2)配置

输入 ctrl+shift+p打开输入框输入 SFTP:Config,此时会在 .vscode 目录下生成 sftp.json 文件,配置主机名称、IP、协议、端口、用户名、远程同步地址、本地保存时是否同步上传到服务器(不包括重命名和删除操作)、上传时忽略的文件

sftpjson

(3)上传

方法一:

输入 ctrl+shift+p打开输入框输入 SFTP:Upload Project,然后选择要上传的项目文件夹,再输入服务器密码即可

方法二:

在命令行中

上传文件夹 scp -r xxx/xxx/文件夹/ 用户名@IP地址:/home/xxx/存放文件夹的目录

上传文件夹中所有文件 scp xxx/xxx/文件夹/* 用户名@IP地址:/home/xxx/存放文件的目录

上传文件 scp 文件1 文件2 文件n 用户名@IP地址:/home/xxx/存放文件的目录

遇到的问题:在上传时,若遇到服务器文件夹为 root 用户创建则无法写入,会出现 “Permission denied, please try again”错误。

解决:在服务器上为文件夹授权, chmod 777 由root创建的文件夹

然后可在xshell登录服务器或在vscode中连接登录服务器打开文件夹,进入虚拟环境,运行代码

4、在vscode中使用python导入不同级目录下的文件时报错ModuleNotFoundError: No module named ‘xxx’

假设文件目录为

-project
  --dir1
    ---file1.py
  --dir2
    ---file2.py

在file2.py中使用from dir1.file1 import xxx导入file1.py里定义的变量或函数时出现报错 ModuleNotFoundError: No module named ‘dir1’

解决:在import之前将文件目录所在路径添加到搜索路径中

import os
import sys 
sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from dir1.file1 import xxx

这里是把项目 project 的绝对路径插入搜索路径中的第一个位置

其中os.path.abspath(__file__)表示 file2.py 所在的绝对路径

os.path.dirname(os.path.abspath(__file__))为 dir2 目录的绝对路径

os.path.dirname(os.path.dirname(os.path.abspath(__file__))))为项目 project 的绝对路径