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

一只小狐狸带你解锁 炼丹术&NLP 秘籍

在合格的炼丹师面前,python可能被各种嫌弃

前不久卖萌屋的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

就可以将环境里绝对路径改成相对路径,从而完成跟当前机器的解耦。

不过亲测对有的包解耦不彻底,尤其是ipython这种有bin文件的。这就需要手动的将环境里bin目录下的这些bin文件首行的解释器路径改成相对的(比如直接/bin/env python)。最后就是改改bin目录下的activate系列文件中的绝对路径啦。至此就可以放心的带着小环境穿梭在各大机器了,且无需考虑目标机器是不是离线机器。

别忘写个自动配置脚本

上一节将python环境,cuda、cudnn、nccl、hadoop等与机器解耦后,就可以再带上vimrc,bashrcinputrc等文件一起跑路了。这时候就发现bash script真香了,把你的配置流程直接写进脚本里,这样到了新环境直接run一下这个脚本,你的全套家当就搬过来啦。

懒人的alias

说完了环境准备和搬家的事情,然后就可以开始谈谈怎么偷懒了。

虽然精力旺盛的时候,多敲几个字母也没什么,燃鹅,当你深夜面对实验结果甚为沮丧时,你就会发现敲个nvidia-smi都是那么无力。所以,干脆就提前把懒提前偷一下。

贴一个自己的常用懒人alias,可以考虑写入到你的~/.bashrc

function enshort() {alias l='ls -a'alias d='du -h --max-depth 1' alias n='nvidia-smi'alias vb='vi ~/.bashrc'alias sb='. ~/.bashrc'alias sc='screen'alias nvfind='fuser -v /dev/nvidia*'alias nving='watch -n 0.1 nvidia-smi'
}

不过需要强调一下,如果多人共用机器,记得像上面一样把你的私人alias封到函数里,以免与他人命令冲突,造成不便。为了进一步偷个懒,你可以把这个函数的启动封装在virtualenv的启动脚本里,或者在外面再封一层更高level的环境启动函数。这样就避免了每次登陆都要手动启动一堆函数的麻烦。

bash function用起来

虽然对算法工程师来说,bash一般用来写一些非常高level的流程,大多数只是顺序执行一堆命令外加写几个分支,不过,巧用bash中的function来封装一些高频的操作往往也可以大大提升日常炼丹效率。

例如,平时炼丹实验挂一堆之后,我们可能时不时想看看某个实验的cpu利用率,内存占用等,每次用ps一顿操作都要敲不少东西,于是机智的小夕还是选择封装一个小function

# Usage: psfind <keywords> (RegExp supported)
function psfind() {ps aux | head -n 1ps aux | grep -E $1 | grep -v grep
}

这个函数既支持psfind <进程号>,也同样支持匹配进程中的关键词,且支持正则表达式来支持复杂查找。最主要还是格式化了一下输出,这样打印出来会看起来很清晰。

觉得好用的话欢迎拿走(记得留个赞

与bettertouchtool的组合技

提高linux环境中的炼丹效率,除了上述这种在.bashrc中作文章,mac用户还可以通过一个众所周知的神器APPbettertouchtool来组合提升日常效率。大部分mac用户可能只是用它来强化触控板手势了,其实它的键位映射也是炒鸡无敌有用的鸭~

例如,众所周知,在命令行里或者vim的插入模式下,我们可以通过ctrl+w来向前删除一个单词,这个命令虽然无敌有用,但是早已习惯了ctrl/option/cmd+delete的我们还是会觉得这个设定比较让人精分,导致影响了它的实用性。不过,用btt完全可以把这个ctrl+w这个键位映射到我们习惯的option+delete来删除一个单词(mac系统中大都支持opt+del删除一个单词的设定),如下图

当然了,如果你用的不是mac自带的终端,而是iterm等第三方的话,也可以考虑通过内置的键位映射功能来完全这个操作~或者,就适应一下ctrl+w的设定啦╮( ̄▽ ̄"")╭

别再无脑vim了

linux新手在去查看一个(文本)数据集或日志文件时,基本就是直接用vim打开后开始上下左右的看。其实,对NLPer来说,相当多的场景是无需反复去vim的,有时反而会更加问题的复杂度,或阅读体验更糟。

先说说最简单的,关于随便瞥一眼数据集的开头。

当数据集比较大时,哪怕是用sublime、vim这种高性能、轻量级文本编辑器打开,都要等待很久很久(虽然vim可以ctrl+c打断),超大单文件数据集更是噩梦了。其实只是瞥一眼的话,完全可以使用head命令来快速取出一个文件的前多少行,比如

head -100 train.csv

就可以直接print出来train.csv这个文件的前100行数据,完全没必要把整个文件都load进内存里。

此外,有的文件内容可能是实时变化的(比如模型训练时的训练日志文件),如果希望持续track一个文件的内容,可以通过tail命令:

tail -f log

如果不仅要瞥一眼,而且还想查看或获取到文件中某些特定的行。

有的小伙伴就觉得必须要叫vim爸爸来帮忙了,甚至要求助python。其实这种高频场景也完全没有必要的,直接用grep就能找出你感兴趣文件中的那些你感兴趣的模式。

这方面尤其在处理训练/eval日志时非常高效

例如,这么一份训练日志

我们eval了几十上百个ckpt,每次eval都往里面打了一堆日志,但是我们希望只看一下各个step的dev evaluation的结果,那么借助管道和grep可以非常轻松的完成

cat eval.log | grep '\[dev'

grep的想象力也绝不是限制在管道里面,它完全可以单独使用,直接去从若干你感兴趣的文件中寻找特定的模式(比如./*/*就把所有子目录也一起遍历了),在你批量管理、分析实验日志时,用熟之后堪称神器。

当然了,进阶一点,用好awksed后,能摆脱vim和python的情况就更多了,尤其是在快速编辑方面。不过,这块一写可能又停不下来QAQ算了算了,下次再写吧(能凑够一篇文章的话)

别再无脑python了

如上节所述,使用grepawk等linux的一些神器命令可以在很多高频场景下替代文本编辑器,大大提升炼丹效率。其实在coding层面上,也是如此。

例如,如果我们想把上一节末尾的图片中的日志,按照step从小到大排列后展示出来,怎么做呢?

可能又有小伙伴要说上python了。殊不知linux中内置了很多方便易用的命令,包括排序sort命令,去重uniq命令等,因此,这个排序的需求,在上一节末尾的grep命令处通过管道连接一个sort就直接完成了

cat eval.log | grep '\[dev' | sort

在数据集处理方面,还有一个NLPer必知的命令,就是cut啦。这个命令堪称是处理csv/tsv格式文件的神器了,当你需要从CSV数据集文件中提取出某些列时,可以直接帮你免去开python的麻烦

例如,如下众所周知的Quora Question Pairs(QQP)数据集:

从第一行可以看到这个数据集包含6列:id  qid1    qid2    question1   question2   is_duplicate

但实际上我们单纯训练一个q-q文本匹配模型的话,只需要最后三列就够了。不懂linux的小伙伴可能会用python打开文件,然后一顿for循环和str.split了。

但实际上,用上cut之后配合管道只需要一行

cat train.tsv | cut -f 4,5,6 > train.tsv.cut

就把数据集的第4,5,6列提出来了,并且存储在了train.tsv.cut文件中。如果需要的数据来自于两个文件,可以分别cut出来再将这些列拼到一起(新文件是m+n列,可以理解成cat是纵向连接两个或若干个文件,而paste则是横向连接):

paste file1.txt file2.txt

最后,训练数据的去重和shuffle,也完全可以不用python去写,分别用uniq和shuf结合管道就能一行命令搞定:

sort train.tsv.cut | uniq | shuf > train.tsv

总之,类似于cutwc(统计词数、行数的神器)的这种linux中的小命令很多,很大程度上帮我们解决了一些简单高频的数据集处理的需求(尤其CSV),避免了无脑使用python导致的低效时间开销。

另外,不仅简单场景可以直接用linux命令组合替代python,一些高端场景下linux命令与python的配合更是容易让复杂的事情变得非常简单。一个很常见的就是对大型数据集的单机并行处理:

&+wait:最简单的单机并行数据预处理

当数据集比较大时,我们要跑分词、shuffle、抽文本特征之类的可能会非常非常慢(千万级以上就明显感觉不行了,过亿之后要命了),如果强行把这些逻辑都丢到训练里面,又可能明显拖慢训练速度(虽然可以通过异步数据读取来缓解下),且极大的增加了训练阶段的CPU资源消耗。然而,如果我们用单核来跑全量数据,这个核用上洪荒之力可能也要跑一晚上(处理阅读理解这种数据的会就更久了)。要迭代预处理策略就会变得非常困难,怎么办呢?

用python手撸多线性代码?确实可以,但我嫌麻烦╮(╯▽╰)╭

最简单的做法就是用类似map reduce的范式来写,让python脚本仅仅去处理一个“单位”的数据,这里的单位可以是一个文本行,也可以是一个数据集的文件part。

例如,我们一个CSV文件里有1亿条样本,那么我们可以先用split命令把它切成100个part(先用wc -l确定行数),然后并行处理后再merge起来,随手写下:

for i in {0..99};
dopython process.py train.tsv.part$i > train.tsv.part$i.tmp &
done
wait 
cat *.tmp > train.tsv.processed
rm *part*

就坐等小服务器上所有的CPU核心被打满进行数据处理啦~

但!是!如果代码bug了怎么办?等所有进程跑完吗?nonono,当然是一键kill啦~这里一种是偷懒的办法,直接用pkill -f <xxx>来杀死所有包含某个名字的进程

pkill -f 'process.py'

不过这样可能存在误杀的情况,需要注意名字不要取得太过于危险╮( ̄▽ ̄"")╭

此外,由于深度学习框架和一些库的原因,或者我们不小心打印了过量的内容到屏幕上,这时候也容易出现进程退不出来的情况(很多小伙伴选择了断开ssh链接),这时候可以使用ctrl+z将前台进程强行丢到后台并挂起,然后kill %N来杀掉它(这里的N一般是1,除非之前已经将一些前台进程挂后台了)

按下ctrl+z之后:

[1]+  Stopped                 top

[xixiaoyao@xxx.com emmm]$ kill %1

好困QAQ发现篇幅有点长了,还是写到这里戛然而止吧。喜欢本文,期待后续炼丹技巧分享的小伙伴们记得持续关注小屋&星标小屋 哦。

夕小瑶的卖萌屋

_

关注&星标小夕,带你解锁AI秘籍

订阅号主页下方「撩一下」有惊喜哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019 阿里Java 4轮面试题,含必考题答案参考!

Java一面 hashmap源码问题 HashMap底层结构 put操作讲一下 HashMap、HashMap如何保证线程安全、ConcurrentHashMap JVM有哪些回收算法&#xff0c;对应的收集器有哪些&#xff1f; jvm g1的内存模型讲一下&#xff0c;G1和CMS收集器的区别&#xff1f;以及G1收集器对CMS的改…

技术动态 | 自底向上构建知识图谱全过程

本文转载自公众号&#xff1a;阿里技术。“The world is not made of strings , but is made of things.”——辛格博士&#xff0c;from Google.知识图谱&#xff0c;是结构化的语义知识库&#xff0c;用于迅速描述物理世界中的概念及其相互关系&#xff0c;通过将数据粒度从d…

数据结构--单链表single linked list数据结构C++实现

2018年2月开始学习的 C Primer&#xff0c;到今天2019年3月已经整整一年了&#xff0c;非常感谢在一起交流的小伙伴&#xff0c;是你们的无私帮助和分享使得我能跨越很多技术的坑&#xff0c;感谢你们&#xff01;期待我们2019年一起拿下《数据结构与算法》以及Python入门。 …

搜索中的 Query 理解及应用

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

GAN原理,优缺点、应用总结

<h1 class"csdn_top" id"gan原理优缺点应用总结"><a name"t0"></a>GAN原理&#xff0c;优缺点、应用总结</h1> <br> 本文已投稿至微信公众号–机器学习算法全栈工程师&#xff0c;欢迎关注</article><p&…

java程序员进阶必读书单

以下是我推荐给Java开发者们的一些值得一看的好书&#xff0c;从java基础开始到高级&#xff0c;以及从高级进阶到架构等的书单。 基本都是经典之作&#xff0c;可以利用工作闲暇的时间&#xff0c;系统阅读。 本文作者&#xff0c;优知学院创始人 陈睿 优知学院是IT人在线进…

胡伟 | 面向多实体人机协作消解的对比表生成自动化方法

众包实体消解实体消解&#xff08;Entity Resolution&#xff0c;简称ER&#xff09;旨在发现不同知识图谱中指称真实世界相同对象的实体。众包实体消解&#xff08;Crowd ER&#xff09;在使用机器的基础上&#xff0c;还使用人来完成实体消解任务。众包实体消解的一个常见流程…

poj 1250 解题(链表法)

http://poj.org/problem?id1250 题意大意 住宿床位有限&#xff0c;按顺序入住&#xff0c;用ABC等代表单个人&#xff0c;第1次出现代表入住&#xff0c;第2次出现代表离开 输入&#xff1a; 1 ABCBCA 代表有1个床位&#xff0c; A入住&#xff0c; B入住&#xff0c;入住…

怎样高效阅读一份深度学习项目代码?

犹豫很久要不要把读代码这个事情专门挑出来写成一篇推文。毕竟读代码嘛&#xff0c;大家可能都会读。而且笔者个人读的和写的代码量也并不足以到指导大家读代码的程度。但笔者还是决定大胆地写一点&#xff1a;就当是给自己设立今后读代码的标准&#xff0c;也将一些之前未能践…

令人拍案叫绝的Wasserstein GAN

本文后续&#xff1a;Wasserstein GAN最新进展&#xff1a;从weight clipping到gradient penalty&#xff0c;更加先进的Lipschitz限制手法 在GAN的相关研究如火如荼甚至可以说是泛滥的今天&#xff0c;一篇新鲜出炉的arXiv论文《Wasserstein GAN》却在Reddit的Machine Learnin…

java架构师进阶之独孤九剑:数据结构以及书籍推荐

这是整个java架构师连载系列&#xff0c;分为9大步骤&#xff0c;我们现在还在第一个步骤&#xff1a;程序设计和开发->数据结构与算法。 “ 如果说 Java 是自动档轿车&#xff0c;C 就是手动档吉普。数据结构呢&#xff1f;是变速箱的工作原理&#xff0c; 你完全可以不…

中文文本蕴含计算项目(88万中文文本蕴含数据集+中文文本蕴含模型)

ChineseTextualInference ChineseTextualInference project including chinese corpus build and inferecence model, 中文文本推断项目,包括88万文本蕴含中文文本蕴含数据集的翻译与构建,基于深度学习的文本蕴含判定模型构建. 项目地址:https://github.com/liuhuanyong/Chine…

论文浅尝 | 打通推荐系统与知识图谱: 第一个公开的大规模链接数据集合

本文转载自&#xff1a;RUC智能情报站&#xff0c;知乎专栏链接&#xff1a;https://zhuanlan.zhihu.com/RucAIBox前言&#xff1a;近年来&#xff0c;知识图谱&#xff08;KB&#xff09;被广泛应用于推荐系统&#xff08;RS&#xff09;&#xff0c;但尚未有公开将推荐系统物…

数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

回文串为首尾对称的字符串&#xff1a; 如a&#xff0c;aba&#xff0c;abba等 单链表思路 1.将字符读入链表 2.找到链表中点 3.将链表从中点断开成2条&#xff0c;将后半条反转 4.比较两条链表是否相等&#xff08;比较次数以少的为准&#xff08;长度为奇数时&#xff…

丁香园在语义匹配任务上的探索与实践

前言语义匹配是NLP领域的基础任务之一&#xff0c;直接目标就是判断两句话是否表达了相同或相似意思。其模型框架十分简洁&#xff0c;通常包含文本表示和匹配策略两个模块&#xff0c;因而很容易扩展到相关应用场景&#xff0c;如搜索、推荐、QA系统等。此类模型通常依赖数据驱…

19本高并发编程书籍推荐

Java并发编程实战 &#xff08;java并发的圣经&#xff09; 多处理器编程的艺术 &#xff08;并发编程的各种算法&#xff0c;java实现&#xff0c;有点难度&#xff09; 并发的艺术 &#xff08;多核处理器的共享内存模型中的各种算法&#xff09; Java虚拟机并发编程 &#x…

Wasserstein metric的通俗解释

Wasserstein metric的通俗解释​关注他166 人赞同了该文章本文收录在无痛的机器学习第二季目录。Wasserstein GAN可以算是GAN界的一大突破了&#xff0c;有关它的介绍和使用心得的文章也已经满天飞了&#xff0c;感兴趣的童鞋随便一搜就能好多&#xff0c;今天就不说太多大家说…

肖仰华 | 领域知识图谱落地实践中的问题与对策

本文转载自公众号&#xff1a;知识工场。肖仰华教授2万字长文为您深度剖析领域知识图谱&#xff0c;对领域知识图谱技术与落地应用中的一系列关键问题做了系统的梳理与解答。肖仰华博士&#xff0c;复旦大学计算机科学与技术学院教授&#xff0c;博士生导师&#xff0c;知识工场…

数据结构--链表--约瑟夫环问题(单向循环链表)

问题&#xff1a;一群人站成一个圆圈&#xff0c;从一个人开始报数&#xff0c;1&#xff0c; 2 &#xff0c;。。。m&#xff0c;报到m的拉出去砍了&#xff0c;求被砍的顺序和最后一个活下来的。 利用单向循环链表实现 C代码如下&#xff1a;&#xff08;参考书籍&#xff…

献给新一代人工智能后浪——《后丹》

一只小狐狸带你解锁炼丹术&NLP秘籍视频来源&#xff1a;AIZOO《后丹》那些口口声声&#xff0c;掉包调参侠的人&#xff0c;应该看着你们像我一样&#xff0c;我看着你们&#xff0c;满怀羡慕。人类积攒了几十年的科技&#xff0c;所有的模型、数据、框架和显卡&#xff0c…