bamboosdu / EfficientResearchWork

Efficient research work environment setup for computer science and general workflow for Deep Learning experiments

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

EfficientResearchWork

Efficient research work environment setup for Computer Science and general workflow for Deep Learning experiments. Contribute to our lab VCL.

Contents

Work environment setup

Terminal

系统自带的terminal往往比较简单,不支持多窗口和各种定制。而在实验中经常需要开多个terminal窗口(比如我需要同时连多台服务器),所以系统自带的原始terminal使用起来会比较不方便。建议使用以下的terminal软件,以支持多窗口、分屏和快捷切换的特性。

  • Linux: Terminator. 安装简单,例如此处
  • Mac: iTerm2. 按照官网安装即可。
  • Windows: MobaXterm. Win 下功能最全面,UI 最清爽的工具。

安装完毕之后不需要掌握太多的功能,一般只需要用到多窗口、分屏的功能,掌握切换窗口/分屏的快捷键即可。能用键盘的操作就别用鼠标去点!此外,背景半透明等额外特性看个人需要是否使用。

Shell

Shell对于工作效率可以说是重中之重了,一个好的shell能成倍提高工作效率!一般系统自带的shell都是未经配置的bash,功能比较简略。

在此,强烈推荐使用zsh及其插件管理工具oh-my-zsh!!! 其功能极大的简便了命令行操作,相信用过了都会觉得真香(看看Github 9万多star就知道了)。

  • 安装与(推荐)配置过程

    1. 按照这里按照zsh和机器插件管理包oh-my-zsh。注意oh-my-zsh是zsh的一个插件管理包,我们还需要通过它来安装其他插件来实现各种强大的功能。
    2. 安装插件zsh-autosuggestions,注意按照这里的命令通过oh-my-zsh来方便安装。这个插件的功能是更强大的命令补全。
    3. 安装插件zsh-syntax-highlighting,注意按照这里的命令通过oh-my-zsh来方便安装。这个插件的功能是命令行的语法高亮,方便阅读命令的同时也会让你的命令行更加酷炫。
    4. 安装插件extract,只需要在zsh的配置文件~/.zshrc里加一行即可。这个插件的功能是简化各类解压操作。
    5. 安装插件git,可选,简化git的相关操作。
  • 常用特性

    • 命令补全。极其强大!系统自带的bash往往只能一个一个顺序地往上恢复历史的命令,而我们配置后的zsh可以迅速地恢复任意历史命令。例如我想恢复我的上一次python命令,简单的敲几个字母pyt后,历史的命令就显示出来的了,在按一下方向键⬆️就恢复了:
      autosuggestion

    • 一键解压。linux下各类的压缩文件的解压缩命令往往不同,很难记住,extract插件让我们能够通过x这一个字母解压几乎所有类型的压缩文件。

    • 各种小的命令简化。我们配置的zsh自己alias了一些命令,如.. = cd .., l = ls -alh等等。

Server

DL的实验基本都需要在服务器上跑,所以一些针对服务器的操作简化是很必要的。

  • Connection
    通过ssh username@server_ip命令连接服务器是大家常用的操作,然而每次都需要输入用户名、服务器ip和密码是不是很麻烦。强烈推荐一个ssh xxx一键登录的操作

    1. 免密登录.
      原理是通过公私钥登录。我们先通过ssh-keygen生成一个rsa公私钥对:

      $ ssh-keygen -t rsa

      这样会在~/.ssh文件夹下生成一个公私钥对, id_rsaid_rsa.pub(或者其他你命的名字)。接下来把公钥拷贝到服务器上:

      $ ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip

      这样配置之后再通过ssh username@server_ip登录就不需要输密码了。

    2. 配置连接的别名. 我们进一步配置ssh连接,通过vim ~/.ssh/config创建(打开)ssh的配置文件,写入:

      Host lab
        Hostname 111.222.333.4
        User myname
        Port 22
        LocalForward 16008 127.0.0.1:6008
        IdentityFile ~/.ssh/id_rsa
      

      这样我们就为myname@111.222.333.4建立了一个别名叫做lab,并且关联上了之前配置好的rsa的私钥。同时LocalForward将服务器6008端口转发到本地的16008端口,免去了通常使用tensorboard时ssh的-L参数。
      以后只需要通过ssh lab即可直接登录服务器,比原来简便了很多。

  • tmux
    tmux是一个unix-like系统下的命令行多路复用工具,可以帮助我们在命令行中同时开多个窗口,并且保证在其中跑的程序不会因为服务器连接的中断而停止,这对于长时间运行的实验(如神经网络训练)尤为重要。大多数人对tmux应该不陌生,也听过有用其他类似软件的。

    • 安装与推荐配置
    1. 安装tmux,按照这里
    2. 配置tmux。同样tmux也可以通过配置来强大其功能并美化其外观,我个人使用的是这个.tmux配置,安装简介,使用方便,外观好看。
      ohmytmux
    • 常用操作
      推荐阅读这个指南来熟悉tmux的常用操作和概念。推荐用一个session来管理一个project,里面的每一个window(或者panel)来管理一个实验,多个实验同时用不同的window(或者panel)来跑。

Code editor

  • python
    强推PyCharm!!通过学校邮箱注册即可获得免费的专业版。

    常用特性

    • 远程服务器直连/同步。按官方指南creating-a-remote-server-configuration操作即可。本地ide修改代码,文件即刻同步到服务器上,对于在服务器上跑实验但是又想本地改代码的人来说十分方便。
    • 使用远程服务器的python解释器。依旧官方指南configuring-remote-interpreters-via-ssh。本地修改代码可以按照远程服务器的python解释器来进行补全和提示,不必再担心本地和远程环境不一样的问题。
    • 快捷键crtl+Bcommand+B for Mac)进行函数或变量声明的一键查询。
    • 快捷键crtl+Wcommand+W for Mac)快速关闭当前页。
    • 在pycharm内对一个project进行git管理。官方指南写的比较复杂。
  • C/C++
    待补充。

  • Vim

Cloud Storage

待补充。

Deep Learning Experiments Workflow

这一部分针对有python和深度学习基础但实战经验不是很丰富的同学。
若没有深度学习基础,推荐学习斯坦福公开课CS231n
若不熟悉深度学习框架,建议先学习一遍其官网的官方教程:PyTorchTensorFlowTensorLayer.
硬件环境(nvidia-driver+CUDA+cudnn)的搭建:yixin.

一个深度学习的项目往往需要进行大量的调试和对比实验,而且debug往往比较困难,所以代码和实验的组织特别重要,特别要关注可复现性、易扩展性。

Virtual Environment

不同的项目可能需要用到不同的python环境,所以用一些虚拟环境/python包管理工具将它们相互之间隔离开来是非常有好处的。

  • Anaconda
    Anaconda提供了强大而方便的包管理与环境管理的功能。个人习惯于将不同深度学习框架配置到不同的环境中,如PyTorch, TensorFlow各自单独一个环境,以及为git上有些久远的python2项目单开一个python2环境,基本就能满足需求。
    使用anaconda完成不同cuda版本环境并存->这里

  • virtualenv 待补充。

Code structure

大多数深度学习的代码可以按照以下结构划分,将各个功能分割开来(便于debug和调试):

  • config.py 定义实验的超参数和全局变量,例如网络结构的超参数、learning rate、epoch数、实验/数据路径等。
  • dataset.py 定义数据的供应流,提供获取数据的接口给train.py使用,例如pytorch里的DataLoader对象。
  • network.py 定义模型的网络结构。
  • agent.py 定义一个控制训练过程的容器,提供train.py需要的接口,特别是训练中间过程的保存与恢复。tensorflow V1里叫做session,pytorch里需要我们自己写。
  • train.py 执行训练的主文件,尽量简短。
  • evaluate.py 执行evaluatoin/prediction的主文件,尽量简短。
  • utils.py 常用的工具函数和对象。
  • 其他(如visualization等)

样例代码:PyTorch_Template

Experiment organization

  • 每一个实验开一个文件夹
    在项目总目录下,每一次实验单开一个文件夹,作有意义的命名,这是为了实验的可复现和对比。
    例如,第一次写好了一份代码并跑了一次完整的实验,该实验名为baseline放在项目总目录下。那么若我想把网络层数增加一倍再试试看,那么则先拷贝baseline的内容到一个新的文件夹baseline_layer2x下,然后在baseline_layer2x修改网络层数,之后再在该文件夹下跑新的实验。
  • 代码和数据分离
    一般来说,服务器上的硬盘空间会进行划分,会有很大的空间专门划分给数据存储,另外有一部分用于常规文件。因此我们应尽量将数据放在大的硬盘分区内,与代码分离。这里说的数据既包括用于训练数据,也包括训练过程中产生的数据(训练日志,模型文件)等。所以训练过程中产生的数据train_log需要我们的代码将他们放到硬盘的数据分区中,但为了方便访问,我们可以在实验文件夹下建立一个软连接索引到实际存放的位置:
    trainloglink
  • 使用git进行版本控制
    使用git进行版本控制是很好的习惯,结合PyCharm的功能,可以很方便的让我们看到代码相对于之前的commit改动了什么:
    gitpycharm

Visualization

网络训练过程中非常有必要对loss和中间结果进行可视化,tensorboard基本算是标配的工具。一键安装:

$ pip install tensorboard

TensorBoard 通过读取 TensorFlow 的事件文件(看作日志文件)来运行。TensorFlow 的事件文件包含运行 TensorFlow 时生成的总结数据。

  • 在TensorFlow中,通过tf.summaryapi生成事件文件,参见官方文档
  • 对于PyTorch,我们可以通过一个第三方的包tensorboardX来生成事件文件。看完其样例代码就肯定会用了。

假设我们在服务器上/mnt/username/project/baseline/log位置生成了一次实验的事件文件:
接着我们运行tensorboard读取上述事件文件:

$ tensorboard --logdir /mnt/username/project/baseline/log --port 6006

运行后,我们可以在localhost:6006(即127.0.0.1/6006)查看可视化结果。但是由于服务器上一般没有图形化界面,我们没办法通过浏览器打开该地址。解决方法是,我们在ssh登录服务器的时候建立一个通道,将服务器端口6006的数据转发到一个本地端口上:

$ ssh -L 16006:127.0.0.1:6006 lab

参数-L 16006:127.0.0.1:6006建立了一个通道(也可写在ssh配置文件中),将服务器端口6006的数据转发到了本地16006端口上,于是我们可以通过本地的网页浏览器访问127.0.0.1:16006查看可视化结果。

Debug Trick

  • 模块测试代码
    DL程序debug很容易让人头大,我们最好以模块化的思维去考虑问题出在哪一个模块:数据、网络结构、后处理等等。为了预防bug的产生,我们可以在按照前述代码结构,在每写好一个模块后,就可以写一个简单的测试函数,来看看代码是否产生了期望的行为。比如,关于数据处理部分dataset.py,简单打印一个batch的结果,看看是否符合期望:
  • 数据供应速度
    在GPU上跑程序的时候,用nvidia-smi查看GPU使用情况的时候,出了关注显存占用情况,还应去关注一下Volatile GPU-Util这一信息。一般来说,使用率越高越好;如果一直比较低,说明程序有很多时间花在了CPU上,很有可能是数据供应的速度没有跟上模型计算的速度,造成了GPU资源的浪费,程序运行速度慢。解决方法一是优化数据供应dataset.py部分的代码,二是增加数据供应的线程数(如pytorch里的num_workers),三是检查其他部分比如后处理/可视化部分代码是否可以优化。特别地,python里尽量避免显式for循环。
  • 分析可视化结果
    • training loss远小于validation loss,说明网络过拟合,可适当加正则项(dropout, BN, etc.)或做数据增强。
    • training loss都降不下去,说明网络欠拟合,检查网络结构和数据处理代码。
    • loss曲线抖动很大,常见原因是数据噪声比较大、训练任务过于困难,或者batch size开的太小,或者learning rate开的太大。
    • 可以将多组实验的日志文件放在同一文件夹下,同时用tensorboard可视化,便于对比观察:
  • 经验之谈
    • 增大batch size的同时适当增大learning rate,保持两者的平衡。原因是增大batch size之后,一个epoch内梯度下降的次数减少了,所以可以让每一步可以走得长一点(增大learning rate)。
    • 对learning rate做动态调整,常用exponential decay或者step decay(每隔一定step减小lr)。原因是通常训练初期使lr较大加快收敛,训练后期使lr较小能够在局部收敛得更好。
    • dropout/BatchNorm在训练/测试时的不同行为的切换。
    • 对于回归任务,网络最后一层尽量不用非线性激活单元。
    • BN层前的卷积层尽量不要加bias项。原因是BN层会做normalization。
    • ...

Commonly used CG software

About

Efficient research work environment setup for computer science and general workflow for Deep Learning experiments


Languages

Language:Python 96.5%Language:Shell 3.5%