上周经过小石头同学的提点,找到了Colaboratory这个神奇的地方,小试几天后发现这真是个良心之作,完全对得起Google的“不做恶”的信条,既然是免费的,那么不好好利用就对不起Google的程序猿们了,你们说是不是,哈哈
下面是我这几天的一点小小的总结,欢迎指点,大家有什么经验的可以拿出来一起交流交流,
1,Colab免费GPU的基本使用方法就详细写了,很简单,去下面的教程自行学习吧
https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d
2,我们希望使Colab与Google Drive互联互通
这样方便我们上传下载相关文件
===执行如下代码===
!apt-getinstall -y -qq software-properties-common python-software-propertiesmodule-init-tools
!add-apt-repository-y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-getupdate -qq 2>&1 > /dev/null
!apt-get-y install -qq google-drive-ocamlfuse fuse
fromgoogle.colab import auth
auth.authenticate_user()
fromoauth2client.client import GoogleCredentials
creds= GoogleCredentials.get_application_default()
importgetpass
!google-drive-ocamlfuse-headless -id= -secret= &1 | grep URL
vcode= getpass.getpass()
!echo | google-drive-ocamlfuse -headless -id=-secret=
==================
===设置工作目录===
!mkdir-p /content/drive
!google-drive-ocamlfusedrive #其实这就是在虚拟机里创建了一个网络硬盘并映射到Drive这个目录
importos
os.chdir("drive")#指定drive为当前的工作文件夹
==================
3,Python命令在Colab下直接执行,只要注意不用用和Window桌面端有关的代码就行了
4,Colab下Linux命令行的使用方法总结
1)多数命令在程序名字前面加“!“就行了
如果你在网上的文件或别的地方看到在LinuxConcole里面执行的是:
gitclone https://github.com/cysmith/neural-style-tf
那么在Colab里面就是在前面加感叹号:
!git clonehttps://github.com/cysmith/neural-style-tf
还有一种两条命令连续执行的话(中间用|分隔)只要在第一条前面加!,第二条命令前面不能加!,如下:
!./deepmatching-static$file1 $file2 -nt 0 | ./deepflow2-static $file1 $file2 $forward_name -match
2)部分文件及目录操作相关的命令,在前面加%,如:
%cd/drive:current directory把工作路径设置为指定的目录
%rm*.jpg:remove删除文件
%rm-rf /drive/temp:remove删除目录
%rn*.jpg *.jpeg:rename改名
…
3) Linux命令调用之前代码中申明的变量在其前面加$:
temp_dir=’/drive/temp’
%rm-rf $temp_dir
4) Colab下执行Linux命令,路径中如果没有空格,就不用带引号
%cd/drive/temp
5)由于bash xx.sh批处理文件在Colab里面执行问题很多,不能正确执行.sh里面的的批处理命令(写法不是规范的Colab里面的写法),所以需要花时间翻译成Colab里面的格式,然后直接在Colab下执行(研究这个事情干掉了我上周末的大部份时间。。。),下面例子比较典型:
例1:
.sh文件内的写法:
$(ffprobe-v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height"$1")
Colab里面的写法:
第一步:把$(xxxxx)改成!xxxxx:
!ffprobe-v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height"$1"
第二步,”$xx”,这是sh里面引用变量xx的方法,改成$xx
!ffprobe-v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height $1
第三步,$1, $2, $3这些是在执行sh时带的参数,1,2,3是引用的顺序,需要替换成外面真正的变量名字
如:本来是这样引用的:bash xxx.sh ,那么就是sh文件里面的$1
在你的Colab主代码里面是变量fn
那么上面的代码就变成了
!ffprobe-v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height $fn
大功告成!把这个代码复制到Colab里面执行就不会出错了
下面再举两个例子大家感受一下:
例2:
.sh文件内的写法:
mkdir-p "$temp_dir"
Colab里面的写法:
!mkdir-p $temp_dir
例3:
.sh文件内的写法:
$ffmpeg-v quiet -i "$1" "$/frame_%04d.ppm"
Colab里面的写法:
!ffmpeg-v quiet -i $fn $temp_dir/frame_%04d.ppm
这里$变成了$temp_dir,因为temp_dir是个变量。
Sh里面的条件语句的语法与python差别也比较大,这里没有什么公式可以转换,只能先理解sh文件的逻辑关系后用Python语句重新写出来,一般也复杂。
例:
Sh文件内写法:
if[ "$width" -gt "$height" ]; then
max_size="$width"
else
max_size="$height"
fi
Python里的写法:
ifwidth >= height:
max_size=width
else:
mex_size=height
5,运行效率问题
虽然Google Drive映射到了的虚拟机里面,但是和所有网络映射目录一样,读写效率低下,所以所以除了一次性写入或读取的东西以及想永久保留的在drive目录下东西建议在Drive目录下操作外,其它可以在虚拟机上系统目录下操作的尽量都在虚拟机上操作,可以建个临时目录,把代码产生的大量过程文件都放到那里,运行完成后清理掉就行了。
- END -
领取专属 10元无门槛券
私享最新 技术干货