Eva0开发笔记

(待填一个eva梗)

Posted by tianchen on January 4, 2020

EVA 开发日记

  • 联网的问题如果tunet卡住了的话
    • /home/eva_share/tunet2018/bin/Tunet2018-c准入
  • 听从初代目网管的意见,安装MiniConda3
    • 文章中,conda公司和Intel有py,从它这里下的包CPU计算会更快说服了我(虽然不知道到底有多真实
    • 而且conda也和pip兼容,何乐而不为呢
    • 之前不装conda是因为它起手就安了一万个包,原来是我没有发现miniconda
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh

// 打开一个新的Shell(重新登录一次)

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
  • 安装了shadowsocks与Proxychains来加快git clone速度

  • 安装opencv
    • conda install python-opencv失败
      • pip3 install python-opencv安装不上
      • 安装了conda之后,对应的python是pip对应的,而pip3对应的是老的python3
    • 中间报了 安装opencv时报错 ImportError: libXrender.so.1: cannot open shared object file: No such file or directory
      • 直接 sudo apt-get install libxrender1
  • 安装tmux并配置
    • 按照网管给的tmux.conf启动
    • 修改一下tmux的快捷键prefix(CTRL+B实在是太远了,改成+x吧)
      • 查看现在的Prefix Binidngtmux show-options -g | grep prefix
      • 在~/.tmux.conf中加上
         set -g prefix C-x
         unbind C-b
         bind C-x send-prefix
        
      • 使其生效:
        • 在tmux中 CTRL+B+(此时还没有改好)): 输入source-flie ~/.tmux.conf
        • 这之后的都ok了
  • 对vim的安装和配置见Ubuntu系统配置!

  • 配置pytorch with cuda
    • eva0上nvcc貌似没有结果(不知道是不是和有好几个container相关)
      • 按照bing到的结果去看 /usr/local/cuda下的version.txt貌似也不是很行
      • 咨询了网管之后的结果
        • 在/opt/cuda-10.0目录底下有着cuda
        • 测试cuda是否能用
          • 运行/opt/cuda-10.0/samples/1_Utilities/deviceQuery/下的deviceQuery可执行文件
          • 开机之后要首先运行一次这个脚本,否则cuda就用不了!
          • 正确的现象
          • 同时给出nvidia-smi结果
          • 在pytorch官网选择安装: Conda-Python3.7-cuda10.1
            • 大概800M的下载之后就安装好了
          • 测试cuda ok没有

            import torch
            torch.cuda.is_available()
            
  • 🐛 Matplotlib.pyplot import的时候报错了
      This application failed to start because it could not find or load the Qt platform plugin "xcb"in "".
      Available platform plugins are: eglfs, minimal, minimalegl, offscreen, vnc, xcb.
      Reinstalling the application may fix this problem.
    
    • 原因是缺少了Qt的支持
      • [在这里找到了解决方案 ]](https://github.com/OpenShot/openshot-qt/issues/1809)
      • sudo apt-get install libqt5gui5
      • 然后理论上就可用远程服务器直接ipython并且用matplotlib画图了
      • 就是响应速度有点慢嗷(因为我还跳板了一级)
  • TF-2.0还不支持Py3.7(LZZSCL

SSH 配置相关

deprecated

  • 那么如何登录eva呢?
    • 配置了Linux环境下通过跳板机直接访问目标机器
      • 一次ssh而不是两次
      • 主要参考了这篇文章
      • 在.bashrc里面加上
        alias eva="ssh zhaotianchen@101.6.64.144 -p 22 -o ProxyCommand='ssh -p 42222 zhaotianchen@101.6.64.67 -W %h:%p'"
        alias fpga="ssh ztc@fpga1.nics.cc -p 22 -o ProxyCommand='ssh -p 42222 zhaotianchen@101.6.64.67 -W %h:%p'"
        
    • 按照上面的配置之后还需要再进行一次秘钥copy
      • ssh-copy-id -i id_rsa.pub zhaotianchen@101.6.64.144 -p 22 -o ProxyCommand='ssh -p 42222 zhaotianchen@101.6.64.67 -W %h:%p'
      • 说明从跳板机登录(2次)需要的秘钥和一次的需要是不一样的
      • fpga1.nics.cc -> 101.6.68.236(由于用ssh config文件这种方式登录的话不能用域名)
  • 服务器的跳板机一定要从一定端口登录,不然就登录Permission denied
    • 比如说eva10.nics.cc必须要从3222 port访问
  • 关于免密码登录
    • 本机的.ssh文件夹里有一对密钥,id_rsa.pub和id_rsa
    • 其中执行ssh-copy-id -i id_rsa.pub $SERVER_NAME实际完成的操作就是把id_rsa.pub里面的东西复制到服务器上的.ssh/authorized_keys里面
      • 由于win并没有ssh-copy-id 命令,可以直接登录服务器手动配置,或者是用scp把authorized_keys给传上去(在win下vim不好使的情况下)
      • 注意scp按照port来传输的命令是scp -P xxx
    • 完成复制之后,从有私钥的服务器登录到新的服务器,可以直接免密码登录(但是注意没有私钥的地方还是不行,所以从中间节点直接连最后是不行的)
    • 其他的比如known_hosts什么的其实不用改也可以
  • Tensorboard远程映射(Deprecated) Use ssh -L 10808:localhost:127.0.0.1 ztc.eva10
    • 通过跳板机查看内网服务器的tensorbord
    • 配置新的登录Eva的方式(以支持端口传播,从而看到Tensorboard)
      • 需要登录两次,首先登录跳板机 with
        • ssh -L 16006:127.0.0.1:8008 account@跳板机ip
      • 然后在跳板机上登录with
        • ssh -L 8008:127.0.0.1:6006 account@服务器ip
      • 最后直接在本地机器上的localhost:16006观察结果
      • 注意这边可能刷新和Load会有一定的延迟,稍微等一会Tensorboard的内容会逐渐load出来
  • 如果X11 Forwarding出了问题,打不开matplotlib,可以先
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

看这里的就可以了

  • 现在的新的Config文件的内容
Host eva
	HostName 101.6.64.169
	Port 22
	User zhaotianchen
	ProxyCommand ssh zhaotianchen@101.6.64.67 -p 42222 -W %h:%p
Host fpga
	HostName 101.6.68.236
	Port 22
	User ztc
	ProxyCommand ssh zhaotianchen@101.6.64.67 -p 42222 -W %h:%p

Host 205
  ForwardAgent yes
  HostName 101.6.64.67
  User zhaotianchen
  Port 42222

Host eva*
  HostName %h.nics.cc
  User zhaotianchen
  ProxyCommand ssh zhaotianchen@205 nc %h %p

Host proxy-eva10
  HostName eva10.nics.cc
  Port 32222
  User zhaotianchen
  ProxyCommand ssh zhaotianchen@205 nc %h %p

Host ztc.eva10
  HostName foxfi-eva10
  User zhaotianchen
  ProxyCommand ssh -p 32222 zhaotianchen@eva10 nc %h %p

Host *.eva*
  HostName %h.nics.cc
  User zhaotianchen
  ForwardAgent yes
  ProxyCommand ssh zhaotianchen@205 nc %h %p

  • 一些解释性的文字
    • nc表示不要再Proxy停下来
    • %h 表示了HostName
    • %p 表示了Port
  • 经过这样的一套配置应该是可以用ssh ztc.eva10这样的命令直接跳过两次跳板机跳上去了
    • 对于一些额外的配置比如说端口映射,可以直接加载最后的这个指令中比如 ssh -L 10808:localhost:127.0.0.1 ztc.eva10
  • 关于上传私钥以免密码登录
    • 首先再本地进行ssh-keygen,会有一个id_rsa(私钥),还会有一个id_rsa.pub公钥(这个比第一个短一些)
    • 其实只是需要在服务器上将本地的id_rsa.pub的内容添加到./ssh/authorized_keys当中即可
      • echo XXX >> authorized_keys 这种形式
  • If after loading keys, logging still requires passwd for eva-8/9
    • Try ssh-copy-key -i id_rsa.pub proxy-evaX
  • 可以通过添加 - 将服务器端口映射到本地
    • LocalForward 127.0.0.1:$PORT_ON_SERVER 127.0.0.1:$LOCAL_PORT`
    • 等效于ssh -L 16379:127.0.0.1:6379 user@host
    • 反向的话可以用RemoteHost
  • ssh的config相关的配置用man ssh_config可以查询
    • -L 表示LocalForward - 将本地端口映射到远端
    • -R 表示RemoteForward - 将远程端口映射到本地
  • Github配置proxy加速clone
    1. 本地的v2ray在10809的端口上开启了http服务
    2. 通过端口映射在登录服务器的时候指定 ssh -R 12450:localhost:10809 建立remote的映射
      • 端口映射-L会出问题,不明原因
    3. 在git的config中这样写 [http] proxy=http://127.0.0.1:12450
      • 在ssh_config当中可以 RemoteForward 127.0.0.1:12450(port on remote) 127.0.0.1:10809
  • 清华校园网准入服务器:
    • 从userreg还是太麻烦了
    • 使用更新之后的auth-thu,直接从release中下载可执行文件,然后直接调用 ./auth-linux_x86_64 auth输入用户名密码就可以了


Ray Setup

  1. 安装ray
  2. 按照scripts/python ray备注中的格式设置ray(每个机器或者conda env只需要设置一次)
    • 需要记录下一个redis-dir
  3. 新建一个experiment文件夹,内部说明方法的名字
  4. 写一个脚本生成新的yaml文件,放置在一个文件夹下
  5. 调用脚本 python train_ray.py –redisdir=XXX $PATH_TO_YAML_DIR
    • 则会自动load下dir目录下的每个yaml文件
    • 每当一个实验完成之后会自动建立一个进程将新的实验添加进去
    • 有两个必须的arg
      • redis-addr 启动ray时候会给的地址
      • result-base-dir 存放log的地址
        • 会自动append上这次调整的参数的名字(也就是experiment的yaml setting所在的dir前面一层)
      • 再后面就是正常main函数的yaml所在的文件夹,会读取该文件夹中的所有yaml并且跑
  • 记不住redis-addr怎么办,因为每一次start ray的时候会随机产生一个,所以我们可以指定一个,在ray的命令里
    • alias ray-start="CUDA_VISIBLE_DEVICES=0,1,2,3 ray start --head --num-cpus 10 --num-gpus 4 --object-store-memory 10000000 --redis-port=12450

Conda Virtual Env

  • conda create -n $NAME python=3.7`
    • 最好直接在最后用python=3.7,这样会直接在当前环境下生成一个环境miniconda3/envs/$NAME/bin/python,更加不容易和global的python搞起来
    • 然后pip应该也是安装到了对应位置不用修改,然后用pip install ipython
    • 安装完成之后虽然which ipython正确,内容也正确,但是输入ipython还是global的 - 需要decativate再重新登录虚拟环境以reload环境
  • conda deactivate 退出现有环境
  • conda info -e 查看现有的环境
  • conda remove -n $NAME --all
  • conda create -n $NEW --clone $OLD; conda remove -n $OLD --all

  • 有的时候更新了环境之后还pip还是指向了base里面的pip
    • 这个时候decativate一下然后再activate就可了
    • 注意一定要deactivate再activate,关掉panel再activate好像是没用的(貌似不是一直work)
      • 现在居然是先输入一个错的conda env名字然后再输入就好了……(人类迷惑)
  • 有的时候会出现无论操作什么都segmentation fault的情况(甚至重装conda以及更新conda)
  • 如果需要rename一个env的话
    • 需要复制一个新环境 conda create --name NEW_NAME --clone OLD_NAME
    • 然后删除老的环境 conda remove --name OLD_NAME --all

源码编译TF

following official guide

  1. 安装prequisite
pip install -U --user pip six numpy wheel setuptools mock 'future>=0.17.1'
pip install -U --user keras_applications --no-deps
pip install -U --user keras_preprocessing --no-deps
  1. 安装bazel
    • 注意需要查看一下bazel的版本,在tensorflow源码的configure.py中有着对应版本所能接受的bazel版本
    • 建议直接从官网,以及官方git repo下载binary安装包安装
    • chmod +X ./bazel-xxx
    • ./bazel-xxx --user
    • 注意这里的–user很关键,会加入环境变量,并且默认是将当前版本的bazel安装到~/bin/bazel * 需要在bashrc中加一行
    • export PATH="$PATH:$HOME/bin" * 还有一种替代方案,相当于是bazel的编译完的版本bazelisk个人没有尝试
    • 其使用应该是替换bazel的,可以直接在bashrc中alias bazel=$PATH_TO_BAZELISK
  2. 下载tf源码
    • (其实可能应该放在安装bazel之前)
    • git clone https://github.com/tensorflow/tensorflow.git
    • 切换到想要的分支,默认为最新的master分只git checkout branch_name # r1.9, r1.10
  3. 配置Build
    • ./configure - 别的都无所谓可以默认,就是要指定一下CUDA的位置/opt/cuda-10.0
    • 经过configure之后的内容是在
    • 有几个预设的bazel build指令
    • --config=mkl
    • --config=v1
  4. 编译(最可能出错的一节)
    • 经过我自己的体验,貌似checkout到老版本进行编译容易出问题(总之我是失败了)
    • 默认的TF-2.0编译 bazel build //tensorflow/tools/pip_package:build_pip_package
      • 对master分支编译1.x版本 bazel build --config=v1 //tensorflow/tools/pip_package:build_pip_package
      • CUDA版本 bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
    • 上次跑这个是失败了 * 注意如果需要在同一个目录下编译多次tf,需要执行bazel clean * 该步骤生成了一个build_pip_package的可执行文件,下一步使用
  5. 生成whl
    • 这一步貌似不容易出问题
    • ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
      • 官方说如果是最新的需要加上一个nightly flag,./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
    • ````pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl```

安装nccl

不确定可能编译出来的tf需要安装这个东西

  • Nvidia官网进行下载
    • 下载对应的cuda版本,需要的平台(x86),需要的发行版(ubuntu 18.04)
    • (当前NCCL好像要求cuda>10.0/cuda-driver>一定版本)
  • sudo dkpg -i nccl-xxx.deb安装
  • 添加key sudo apt-key add /var/nccl-repo-2.6.4-ga-cuda10.0/7fa2af80.pub
    • 甚至我添加key还少了一个库 sudo apt-get install gnupg
  • sudo apt-get update
  • sudo apt install libnccl2 libnccl-dev
  • 安装的nccl.h在/usr/include/nccl.h

  • 由于我的cuda并不在标准位置/usr/lib,所以需要在cuda的对应文件夹里创建两个软连接,才能让tf的configure能够detect到
    • /usr/lib/nccl.h -> $CUDA_PATH/include
    • /usr/lib/x86_64-linux-gnu/libnccl.so.2 -> $CUDA_PATH/LIB64

安装android studio

Trouble Shooting

  • 在哪个路径下启动ray是否关键?
  • 是否可以喂进去多个yaml的dir
  • eva之间scp拷贝数据,用evaX.nics.cc:~而不是ztc-eva8