因為功能本來就很簡單,網路上也有一堆使用教學,所以這裡不需要再重複教那些簡單的東西。
今天來玩點不一樣的,看看colab給我們的虛擬機其實際環境為何?表面上它是給你練習程式用的(自已本機裝個jupyter不是更好用),懂門道的則是會想辦法榨乾這台虛擬機的資源,有GPU & TPU為啥不盡量用來訓練模型?不過Google也說了,你要拿來跑長時間運算的話(訓練模型啦、挖礦啦...),很有可能被中斷運算,更有可能被停止使用Colab,所以佛心還是有其限制的,並不是網路那些教學文說的GPU & TPU用到爽。
先來看它的系統版本,會發現是 Ubuntu 18.04.2:
!cat /etc/os-realease
==================
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
=================
再來看看身份為何,發現是root:
!whoami
=================
root
看看系統記憶體及硬碟:
!vmstat
!echo
!df -h
================
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 3333896 140012 9319100 0 0 140 7 100 186 0 0 99 0 0
Filesystem Size Used Avail Use% Mounted on
overlay 49G 26G 22G 55% /
tmpfs 6.4G 0 6.4G 0% /dev
tmpfs 6.4G 0 6.4G 0% /sys/fs/cgroup
tmpfs 6.4G 8.0K 6.4G 1% /var/colab
/dev/sda1 55G 27G 29G 49% /etc/hosts
shm 6.0G 8.0K 6.0G 1% /dev/shm
tmpfs 6.4G 0 6.4G 0% /sys/firmware
drive 15G 131M 15G 1% /content/drive
看一下process屬於哪個cgroup控制,發現原來容器正是docker:
!cat /proc/self/cgroup
===============
12:rdma:/
11:cpu,cpuacct:/docker/fc5610f0b7ea554a6ef808efc233fdc4d0523b52481412d1fc8f324fa44e3bcb
10:pids:/docker/fc5610f0b7ea554a6ef808efc233fdc4d0523b52481412d1fc8f324fa44e3bcb
9:freezer:/docker/fc5610f0b7ea554a6ef808efc233fdc4d0523b52481412d1fc8f324fa44e3bcb
8:blkio:/docker/fc5610f0b7ea554a6ef808efc233fdc4d0523b52481412d1fc8f324fa44e3bcb
....
看一下目前的python版本及模組路徑(注意,colab或jupyter是透過ipython執行):
!python -V
!ipython -V
import sys
sys.modules['google.colab']
==================
Python 3.6.8
<module 'google.colab' from '/usr/local/lib/python3.6/dist-packages/google/colab/__init__.py'>
想跑個bash也行,不過輸出不會自動清除,輸入也都變成了星號…太跛腳了(後面會介紹如何真正用ssh進入shell),離開打exit或按cell左方的停止鈕即可:
!bash
=====================
bash: cannot set terminal process group (6317): Inappropriate ioctl for device
bash: no job control in this shell
root@fc5610f0b7ea:/content#
它還能直接mount我們自已的google drive:
from google.colab import drive
drive.mount('/content/drive')
=====================
這時我就好奇了,要是能mount的話,不就代表有一支Linux版本的Google File Stream程式嗎?(因為不可能用File Sync同步檔案到虛擬機吧....)
!cat /usr/local/lib/python3.6/dist-packages/google/colab/drive.py
====================
...
drive_bin = _os.path.join(env.root_dir, 'opt/google/drive/drive')
...
====================
原來程式是藏在 /opt/google/drive/drive ,來看一下使用說明:
!/opt/google/drive/drive --helpfull
接下來實驗能不能順利在自已電腦上使用這支程式,我本身是系統是Linux Mint,把
/opt/google/drive/drive
/opt/google/drive/roots.pem
這二支檔案下載回自已本機並放在同樣/opt/google/drive/ 資料夾內,直接下指令掛載:
$umount -f ~/google-drive || umount ~/google-drive; pkill -9 -x drive
$mkdir -p ~/.config/Google
$/opt/google/drive/drive --features=opendir_timeout_ms:86400000,virtual_folders:true --inet_family=IPV4_ONLY --preferences=trusted_root_certs_file_path:/opt/google/drive/roots.pem,mount_point_path:$(echo ~)/drive --console_auth
出現要輸入access key的時候,連到Terminal所顯示的網址去把key複製回來貼上,然後呢?就沒有然後了,因為ip被block掉了,看來這支程式只允許在Colab上跑,殘念。
因為本來都是使用google-drive-ocamlfuse來掛載google drive,不過常常中斷需要重連,所以蠻困擾的,希望Google官方有一天能開放Linux版Google Stream下載。
如果要跑一個對外的server呢?可以使用 http://serveo.net/ 或https://localtunnel.github.io/www/ 用ssh reverse tunnel來開放port給外部連線到這個虛擬機,譬如我想要能夠用新增一個使用者(有sudo權限),並用ssh連到這台虛擬機,那可以利用serveo.net把port 22開放:
虛擬機:
!echo -e "StrictHostKeyChecking no\nUserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
!echo -e "ClientAliveInterval 120\nClientAliveCountMax 720" >> /etc/ssh/sshd_config
!/etc/init.d/ssh restart
!apt-get update
!apt-get install -y autossh
!adduser userduck; adduser userduck sudo
!autossh -M 0 -R duckvm:22:localhost:22 serveo.net > /dev/null 2>&1 &
2020.10.06 update:
servero.net似乎已經失效,可參考寶哥做法:
https://blog.miniasp.com/post/2019/12/15/how-to-setup-ssh-reverse-tunnel,
本機:
$ssh -J serveo.net userduck@duckvm
或
$ssh -o ProxyCommand="ssh -W duckvm:22 serveo.net" -v userduck@duckvm
進去後試一下:
$sudo -i
#apt-get install net-tools
#netstat -tnlp
不過要注意的是,你一次頂多只能開二個notebook頁籤做事, notebook關掉後再重開的話,變數值跟輸出都還是會保留,
還有要注意的是,colab網頁放著不做事超過90分鐘,或者連續執行最長12小時後,虛擬機(docker)都會清除重來(跟在colab上重置runtime是一樣意思),上面的檔案、設定、另外安裝的套件...等等,都會不見,如果覺得每次要重新設定環境很煩,可以把script寫個notebook存起來,每次重新執行即可。
想當成臨時12小時的快閃server用,還是不錯用的,譬如架個web server暫時提供服務,然後colab給它跑個 !ping -i 60 8.8.8.8 維持不要idle之類的。
如果希望colab能連接到local runtime,你可以參考這個別人做好的docker image:
https://dev.to/ikeyasu/how-to-use-google-colaboratory-with-local-runtime-4j1p
不過看起來有點舊,還是ubuntu 17而不是ubuntu 18,我是覺得不如自已拉個python3的image回來自已再裝上jupyter。
ref:
https://stackoverflow.com/questions/55050988/can-i-run-a-google-colab-free-edition-script-and-then-shutdown-my-computer
https://blog.miniasp.com/post/2019/12/15/how-to-setup-ssh-reverse-tunnel,
本機:
$ssh -J serveo.net userduck@duckvm
或
$ssh -o ProxyCommand="ssh -W duckvm:22 serveo.net" -v userduck@duckvm
進去後試一下:
$sudo -i
#apt-get install net-tools
#netstat -tnlp
不過要注意的是,你一次頂多只能開二個notebook頁籤做事, notebook關掉後再重開的話,變數值跟輸出都還是會保留,
還有要注意的是,colab網頁放著不做事超過90分鐘,或者連續執行最長12小時後,虛擬機(docker)都會清除重來(跟在colab上重置runtime是一樣意思),上面的檔案、設定、另外安裝的套件...等等,都會不見,如果覺得每次要重新設定環境很煩,可以把script寫個notebook存起來,每次重新執行即可。
想當成臨時12小時的快閃server用,還是不錯用的,譬如架個web server暫時提供服務,然後colab給它跑個 !ping -i 60 8.8.8.8 維持不要idle之類的。
如果希望colab能連接到local runtime,你可以參考這個別人做好的docker image:
https://dev.to/ikeyasu/how-to-use-google-colaboratory-with-local-runtime-4j1p
不過看起來有點舊,還是ubuntu 17而不是ubuntu 18,我是覺得不如自已拉個python3的image回來自已再裝上jupyter。
ref:
https://stackoverflow.com/questions/55050988/can-i-run-a-google-colab-free-edition-script-and-then-shutdown-my-computer