All in Linux:一个算法工程师的IDE断奶之路

2020-07-08 00:00:00 数据 命令 文件 环境 炼丹

前不久卖萌屋的lulu写了一篇vim的分享《算法工程师的效率神器——vim篇》,突然想起来自己也有一篇攒了几年灰的稿子,在小伙伴的怂恿下小夕强行翻新了一把,于是有了本文。

开篇预警:本文毫无逻辑

已经习惯了IDE的小伙伴可能在炼丹时也惯性的使用pycharm了。这在windows、mac本地炼丹的时候往往没什么,但是一旦要在GPU server端,初学者就往往开始捉急了,更不必说让他all in这个server端的小黑框了。

小夕早期也试过一些笨办法和部分场景下有效的“巧办法”,比如

  • 本地端用pycharm疯狂debug,一切测试ready后,使用scp将相关代码传到服务器起任务
  • 通过syncthing这种同步工具来自动同步本地端和server端代码
  • 利用pycharm内置的远端同步功能
  • server端启动jupyter notebook,本地端浏览器访问

直到遇到了公司跳板机:scp、pycharm、jupyter notebook等通通失联,本地端与远程GPU服务器被跳板机生生拆散了。于是我问同组的小伙伴这该怎么炼丹,ta说:

“咦?直接在服务器上写就好了呀,linux不香么,vim不香么?难道你不会?”

“我。。我会。。。一点╮( ̄▽ ̄"")╭”

回想自己的炼丹之路,其实完全断奶IDE确实不是一件容易的事情。早期一直是用pycharm连接远程GPU服务器来凑合,一直觉得效率还行。直到后来投身工业界后,发现身边的大佬都是在黑框框里裸奔,炼丹效率完全秒杀我,这才下决心彻底断奶。挣扎几个月断奶成功后,愈发觉得

黑框框真香╮(╯▽╰)╭

不过,毕竟自己不是专业玩linux的,只是炼丹之余摸索了一些自己用着舒服的不成体系的方法,所以相关玩法可能会有些“歪门邪道”,如有更优做法,请大佬们在评论区不吝赐教噢~

本文目录:

  • 准备工作与环境迁移问题
  • 与机器解耦
  • 别忘写个自动配置脚本
  • bash function用起来
  • 与bettertouchtool的组合技
  • 别再无脑vim了
  • 别再无脑python了

(其实还能写更多,太困了,还是下次吧QAQ

准备工作与环境迁移问题

其实,如果只是凑合一下,那么在黑框里炼丹基本不需要什么准备工作。换到新的服务器之后,基本就是vimrc里随手写几条tab扩展、换行自动缩进、文件编码之类的,bash里随手建几条alias就可以了,剩下就是一顿pip install。

不过,如果你是一个比较深度的炼丹师,往往python环境里存了一些自己得心应手的小工具包,还有一些自己临时hack了源码的库;可能还要随身携带hadoop客户端以便在集群上炼丹和管理实验;还可能对cuda版本、cudnn版本也有一些要求,需要随身携带一些常用版本在服务器之间穿梭;此外,更不用说vim和bash的一堆个性化配置啦。

这就导致了一个问题,如果炼丹准备阶段,丝毫不顾及炼丹环境与机器的解耦和环境的迁移性,那么一旦机器挂掉,或者你要换机器(老板给你买了新机器),这就会变得非常痛苦。所以在打磨自己的工具链之后,花点时间将工具与环境解耦是非常必要的。

与机器解耦

比较欣慰的是,炼丹依赖的大部分工具和库本身就是跟机器解耦的,比如cuda、cudnn、hadoop client等,挪到新环境后,基本只需要把各bin的路径配置到环境变量PATH里,把各lib配置到LD_LIBRARY_PATH里就可以用了,多再export一下CUDA_HOMEHADOOP_HOME等。然而,python环境的迁移就相对麻烦一些了。

早期的时候,小夕在本地搞了一堆miniconda的环境,然而换机器的时候才发现迁移时这些环境非常容易损坏,或者迁移后发现有时出现奇奇怪怪的问题。当时一顿乱试,也没能很完美的解决,不知道今天miniconda或anaconda是否有改善(本地端的体验真的无敌赞)。

此外,也尝试过用docker管理环境。虽然docker的迁移性很赞,自带云端同步,但是,当你面对一台无法连接外网且没有安装docker的服务器时,你就感觉到绝望了。。。一顿离线安装折腾到疯,机器环境差点时,各种安装依赖会搞到怀疑人生。此外,docker也有一定的上手成本,理解概念、熟悉常用命令和提高生产力的命令方面会比miniconda明显成本高。

终发现,python环境的迁移性方面还是pyenv+virtualenv的组合能应对的情况更多一些,使用virtualenv建好一个环境后,若要将这个环境迁移到其他机器上,分两种情况:

如果你没有修改某些库的源码,所有的库都是pip install的,那自然直接pip freeze一下,将当前环境里的各个库和版本号直接输出重定向到命名为requirements.txt文件中就可以啦。到新的机器的新环境里,直接pip install -r requirements.txt就哦了。

然而,如果你已经深度定制了某些库,这就意味着你需要把整个离线环境打包带走了。这时首先要保证目标机器跟现有机器的大环境差不多(否则一些系统底层库版本差异很大,可能导致上层的库调用出错),然后借助virtualenv自带的命令就非常容易了,直接一行

virtualenv -relocatable

相关文章