配备K80显卡的Google机器

偶然间发现Google的Colab提供的Jupyter Notebook功能非常好用,而且还提供GPU显卡。

11G显存的K80显卡,12G内存,360G硬盘,至强双核处理器。

colab_执行命令.png

真的是良心啊,妈妈再也不用担心我的显卡跑不动了

Update: 目前发现Colab的实例每12小时会回收一次。就需要重新开了~

Colab的初步使用

创建Jupyter Notebook

打开这个链接https://colab.research.google.com/notebooks/welcome.ipynb#recent=true后,点击New Python 3 Notebook按钮创建新的Notebook

创建JupyterNotebook.png

经过几十秒的加载就能看到新的Jupyter Notebook被创建啦,现在我们需要切换到GPU的环境,选择Runtime->Change runtime type

选择GPU环境.png

将硬件加速选为GPU,然后Save即可~

选择GPU环境1.png

执行Python代码

在Jupyter中可以执行Python代码:

a = 1
print(a)
print(type(a))

执行Python命令.png

执行系统命令

在系统命令前面加!即可执行

!nvidia-smi
!ls
!cat /proc/cpuinfo

执行系统命令.png

Colab执行脚本

Colab可以执行各种脚本,然而执行脚本之前通常需要上传和下载文件,所以这一部分会先讲文件的上传和下载,然后就可以执行命令执行脚本了

文件的上传和下载

文件上传

执行脚本,上传文件

from google.colab import files
files.upload()

上传文件.png

下载文件

执行脚本,下载文件

from google.colab import files
files.download('/path/to/file')

执行命令

比如说要执行keras的mnist的demohttps://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py,先把这个文件传到colab上,然后python执行即可~

# 上传
from google.colab import files
files.upload()
# 执行
! python3 mnist_cnn.py

执行结果如下:

mnist_demo.png

每个EPOCH10s,相当快了。

Colab进阶

SSH连接Colab实例

Colab的每台机器放在Google机房内,是内网环境,没有公网IP,经过几番Google发现了这个方法。

既然Colab实例可以执行任意命令,那么我们可以在这个实例上安装SSH服务,并将这个机器的22端口反向转发出来,具体如下。

注册ngrok

ngrok这个服务可以将内网的端口转发出来,有账户的直接登录https://dashboard.ngrok.com/user/login(支持Github和Google账号登录),没账户的可以注册https://dashboard.ngrok.com/user/signup注册。
然后访问https://dashboard.ngrok.com/auth来获得Token。

安装并转发SSH

执行下面的代码后,输入获取的Token

#Generate root password
import random, string
password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20))

#Download ngrok
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
#Setup sshd
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
#Set root password
! echo root:$password | chpasswd
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc
! echo "export LD_LIBRARY_PATH" >> /root/.bashrc

#Run sshd
get_ipython().system_raw('/usr/sbin/sshd -D &')

#Ask token
print("Copy authtoken from https://dashboard.ngrok.com/auth")
import getpass
authtoken = getpass.getpass()

#Create tunnel
get_ipython().system_raw('./ngrok authtoken {authtoken} && ./ngrok tcp 22 &')
#Print root password
print("Root password: {}".format(password))
#Get public address
! curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

执行完毕后,会输出root密码和端口转发之后的地址,在本机ssh登录即可啦,输出如下:

Created symlink /etc/systemd/system/getty.target.wants/getty@tty1.service → /lib/systemd/system/getty@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/remote-fs.target → /lib/systemd/system/remote-fs.target.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/dbus-org.freedesktop.resolve1.service → /lib/systemd/system/systemd-resolved.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-resolved.service → /lib/systemd/system/systemd-resolved.service.
ln: cannot remove '/etc/resolv.conf': Device or resource busy
Created symlink /etc/systemd/system/multi-user.target.wants/ondemand.service → /lib/systemd/system/ondemand.service.
Initializing machine ID from random generator.

Creating config file /etc/ssh/sshd_config with new version
Creating SSH2 RSA key; this may take some time ...
2048 SHA256:4cyZ6SCo73Q6FLm9rKDq3jhrWB3srjhuTySEJqtRg6k root@209bed522146 (RSA)
Creating SSH2 ECDSA key; this may take some time ...
256 SHA256:yy/AH2pJWq/QY8QfEod/Dv+kjYm+DcdPPTg8RhwsB5M root@209bed522146 (ECDSA)
Creating SSH2 ED25519 key; this may take some time ...
256 SHA256:BLCc19q/QzxEiNtLq7mKNbbtgClQXIfH5BtiXMbEzZU root@209bed522146 (ED25519)
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Copy authtoken from https://dashboard.ngrok.com/auth
··········
Root password: 09fcd0efe377
tcp://0.tcp.ngrok.io:17169

执行ssh root@0.tcp.ngrok.io -p 17169就可以登录了~

Last modification:January 9, 2020
If you think my article is useful to you, please feel free to appreciate