深度学习100问
Author:louwill
Machine Learning Lab
Git作为当前世界上最好的分布式版本管理工具,从事深度学习少不了写代码,写代码自然有版本控制的问题。特别是在生产环境下,和组里的同事一起协作进行深度学习项目开发时,版本控制和多人协作必然少不了。深度学习算法工程师,咱们的title是工程师,是工程师就必须要有基本的开发能力。所以,Git作为一项必要的开发工具,我们应掌握哪些技术要点呢?
在深入到具体的Git技术之前,我们先来简单了解一下Git。前面也说了Git是世界上最好的分布式版本控制系统(没有之一),那么什么是版本控制系统?相信大家都有过写毕业论文的经历:有时候想删除一段文字,但又觉得可能还会用到,于是就把包含这段文字的版本又另存为一个word,时间一长,各种另存为的新word越来越多,等到你想找回包含某段文字的版本的时候,你的毕业设计文件夹已经变成下面这样。没办法,只能一个个点开看。
假如要是有这么一个软件,能够帮助我们记录每次修改,并且还能让同学帮我协作修改论文格式,这个软件用起来效果就像下面这样:
版本 |
文件名 |
用户 |
说明 |
日期 |
1 |
毕业设计.docx |
小鲁 |
添加了表索引 |
5/15 22:38 |
2 |
毕业设计.docx |
小王 |
修改了论文格式 | 5/17 09:22 |
3 |
毕业设计.docx |
小鲁 |
修改了文献综述 |
5/19 23:02 |
咱们写代码就跟写毕设一样的道理,也需要进行版本控制和多人协作。现在Git就能帮助我们完成这些事情。下面我们就从版本管理、远程仓库、分支管理和标签管理等4个方面来看看我们应掌握哪些技术。
版本管理
Git安装很简单,这里就略过。现在我们有个用keras测试谷歌colab Tesla T4 GPU训练mnist速度的.py文件。我们先把.py文件所在的文件夹变成git可管理仓库:
git init
现在我们把.py文件提交到Git。提交过程有两步:第一步是先通过git add命令把文件提交到暂存区,然后再通过git commit命令把文件提交到版本库:
git add example.py
git commit -m "first commit"
操作效果如下:
现在我们对.py文件进行多次修改,并且每一次都提交到了版本库。现在我们用git log命令来查看历史纪录:
现在我们要回到某个版本,比如说回到上一个版本,查看上图中每一个版本的版本号,通过git reset命令我们做到:
git reset --hard 4bfa7
本质上来说,Git管理的是修改而非文件。除了简单的版本回退之外,我们还可以利用Git进行修改撤销、删除文件等版本管理功能。
远程仓库
如果仅仅是进行版本管理,那Git与其他版本管理工具也并没有多少特别之处。Git与SVN等版本管理工具一大优势就是Git除了本地版本库之外,还可以连接远程库从而实现分布式管理。Git远程库就是大家都知晓的GitHub,GitHub可以为Git本地仓库提供代码托管服务,只要注册GitHub账号,就可以免费获得Git远程仓库。
本地Git和GitHub连接是需要设置SSH的,这里简单略过。设置好后,在GitHub上创建同名字的仓库:
就可以将本地的Git仓库推送到GitHub上:
git remote add origin https://github.com/luwill/kera_mnist.git
git push -u origin master
除了向远程库推送本地版本库之外,我们还可以从远程库克隆代码仓库到本地:
git clone https://github.com/luwill/Python-100-Days.git
除了GitHub之外,我们也可以使用Gitlab或者Gogs作为团队开发版本管理工具。
分支管理
Git另一项强大的功能就是可以创建分支并进行分支管理。Git可以把我们每次提交串成一条线,而初始化的分支也就是master分支,也叫主分支。但一般来说,团队开发时我们不在主分支上干活,而是创建一个dev的分支来进行开发任务。
创建一个dev分支并切换到该分支,然后用git branch查看当前分支:
git checkout -b dev
git branch
我们在dev分支上对.py文件进行修改后提交:
然后我们切换回master主分支:
git checkout master
但此时我们可以发现刚刚修改的内容并没有看到。这是因为我们刚刚时在dev分支上做的修改,master分支并没有涉及到提交点。现在我们需要把dev分支合并到master分支里:
git merge dev
合并之后我们也可以选择删除dev分支。
这便是Git的分支管理功能。当然我们只是演示了最简单的部分,在进行分支合并的时候也有可能出现合并冲突,这时候需要手动解决冲突才能继续合并。还有一些比如说在Bug分支进行Bug修改,在Feature分支上开发新功能和多人协作等这里不做过多展开。
标签管理
我们利用git进行提交的时候都会有commit号:
通过commit号我们可以找到历史版本。但commit号都是一串数字字母组合,不易表述和记忆。Git对此也有代替方法,那就是标签管理。我们可以对每个版本打上简洁的标签:
git tag v1.0
这个标签是默认打在最近一次commit上的。我们也可以根据commit号进行指定来打标签。
通过标签来查看版本的历史信息:
除了以上操作之外,我们也可以删除标签或者将标签推送到GitHub上。
以上便是深度学习开发者应掌握的一些基本的Git开发技术。完整的Git教程,推荐大家参考廖雪峰老师的官方网站:
https://www.liaoxuefeng.com/wiki/896043488029600
Git命令脑图:
还有一份Git命令小抄表:
后台回复Git即可下载获取PDF版。
有学术和技术问题的同学可以加我微信进入机器学习实验室读者交流群。加微信后说明来意,最好做个简单的自我介绍,让我有个印象,加了一言不发不如不加。
参考资料:
https://www.liaoxuefeng.com/wiki/896043488029600
往期精彩:
一个算法工程师的成长之路
长按二维码.关注机器学习实验室