记录1

最近在想要用显卡做实验的时候,悲催的发现同组老哥在用单张显卡在二进制数据上训练bert base,于是不得不迁移环境。

因为一直都是在docker里面跑程序的。于是在网上毛了个别人的dockerfile,魔改成自己的版本,预装好miniconda和各种软件,自动启动ssh。然后在新服务器上构建了image,方便以后直接用。

然后就是要同步代码和各种文件了,找到了rsync这个工具。
rsync 用法教程 - 阮一峰的网络日志

rsync -anv --exclude='.pytest_cache' --exclude='build' --exclude='**/__pycache__' -e 'ssh -p 11122' . user@host_ip:~/workspace/mlsys

然后是通过conda来安装环境啦
在原来的主机上运行 conda env export > my_env.yml
然后在新的主机上运行 conda env create -f my_env.yml
然后就轻松愉快…等等,安装用pip安装的包时出现网络问题x_x
查了一下,在pip那一部分可以像下面这样添加镜像源

  - zeromq=4.3.4=h9c3ff4c_1
  - zipp=3.17.0=pyhd8ed1ab_0
  - zlib=1.2.13=h5eee18b_0
  - pip:
      - --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple
      - iniconfig==2.0.0
      - numdifftools==0.9.41
      - numpy==1.26.2

python - Environment specific pip.conf under anaconda - Stack Overflow

然后尝试make,发现cmake出现问题,说找不到当前conda环境下的python。鬼知道咋回事,对比了一下,发现这边通过apt安装的cmake版本略低,是3.16.3. 网上查了一下惊喜的发现可以通过pip来安装!而且还是最新版的,好的地方当然是可以用像管理python包一样轻松的一键安装。
果然安装完最新版的就不报错了,说真的,就算报错也看不懂啊(

记录2

服务器突然docker启动不起来,容器全掉了。进去一看,说是因为无法写入文件。试了试果然如此。但是df -h一看,发现74TB的磁盘只占用84MB,明显不可能。用du -h --max-depth=1 /home/data查看文件大小,大概几十TB。
df -ih则显示磁盘的inode,发现问题磁盘inode满了。inode和文件和目录多少有关,相当于一个索引。这应该说明小文件太多了。
问了同学,说是中秋前就发现inode满了,重启发现inode不断增加,很快就又满了。再重启甚至出现挂载不上磁盘的问题。8知道啥情况,流汗了。

流汗了,我的数据都在容器里面,无法开启docker,怎么迁移?
好在容器是一层一层存储的。各层的数据存储在/var/lib/docker/overlay2/目录下
这样只要找到自己想的起来的文件就行了 find /path -name "myfile.py"

接下来是备份下载:

 ssh user@ip "cat somefile" > "file"
 ssh user@ip "tar -czf - /path/to/file" > "file.tar.gz"

但是碰到需要命令里提升权限才能读取的情况就尴尬了,sudo不能直接放在命令里。scp之类的或许有办法解决,但是没时间细看。

下载单文件的最佳解决方案:
在对应路径下开一个简易http服务器,python -m http.server 9000,windows上直接通过浏览器下载。
命令行wget下载

批量压缩目录:
因为不能写入文件,只能把压缩结果通过标准输出用netcat传送到另一台机器上。
问题主机:tar -czf - /path/to/file | nc [target host ip] [port]
目标主机:nc -l -p [port] > file.tar.gz
这个方法的一个问题是不能断点重传,结束了也没有任何提示。需要看结果文件的修改时间戳。

另外rsync等也可以。只是问题主机上刚好没装这东西。