Google Colaboratoryとは
一言で言えば、Google版Jupyter Notebook。Googleが提供する無料サービスの一つで、クラウド上でPythonの記述、実行ができます。
ブラウザとgoogleアカウントさえあれば
Pythonの実行環境をサクッと3秒で構築できてしまいます。
クロスプラットフォームな実行環境であるため共同開発での差異が小さく1、
また各ノートブックがサンドボックスであり初期化 → 実行や新規作成 → 破棄 → 新規作成のような使い切り開発や、
ノートブックのコピー → 破棄のような使い捨てもできます。
Colaboratory へようこそ
出来たこと
機械学習周りいろいろ
githubとの連携
簡易のhttp.server、CGIサーバーの起動
Googleの各無料サービスとの連携、APIの利用
Flask、FastAPI、Streamlit、SQLAlchemyの利用、連携
Ngrok、localtunnelの利用
その他いろいろ
各名称
①メニューバー
各設定、操作ができます。
ファイル、編集、表示、挿入、ランタイム、ツール、ヘルプ
②左ペイン
アイコンをクリックすると、 スペース③ へ各ブラウザを表示することができます。
スペース③ へ各ブラウザを表示することができます。③ファイルブラウザ
②左ペインの一番下ファイルをクリックすると出現します。
②左ペインの一番下ファイルをクリックすると出現します。左上からファイルの選択、状態の更新、ドライブアイコンが並びます。
ドライブアイコンからGoogleドライブをマウントすることができます。
カレントディレクトリは/contentです。
!echo > xxx.txt
!pwd
!ls
/content
sample_data sample.py xxx.txt
④⑤セル
④テキストセルと⑤コードセルがあります。
④テキストセルと⑤コードセルがあります。コードセルの中でシステムコマンドやマジックコマンドが使えます。
| 記法 | ||
|---|---|---|
| システムコマンド | ! | シェルコマンドなど |
| マジックコマンド | % %% |
ラインマジック セルマジック |
先頭に!や%を書きます。
例
!echo hello world
%history
%%bash
⑥エディタ
ファイルや画像、各情報を表示・出力します。
テキストエディタでは一括置換などのショートカットキーがいくつか用意されています。
また、⑤コードセルにも一部テキストエディタとしての機能が備わっています。
編集後、しばらく待つか、タブの上をワンクリックすると上書き保存されます。
⑦ランタイムやセッションの状況
ランタイムが起動しているか視認できたり、セッション管理が行えます。
ショートカットキー
| キー | 操作 | 場所 |
|---|---|---|
Shift + Enter
|
セルの実行 | コードセル |
Ctrl + D
|
一括編集 | コードセル エディタ |
便利シート
基本
コードセルに書く。
システムコマンドやマジックコマンドは、pythonコードと一緒に書くことができます。
例
print("start") #python
# シェルコマンド
!ls
print("end") #python
start
sample_data sample.py xxx.txt
end
各コードセルの変数の値は保持されます。
a=2
print(a+3)
5
コードセルで保持された変数をシステムコマンドで使う。
$変数名でシステムコマンドで使えます。
例
path="tmp1"
!mkdir /content/$path
/content/tmp1が作られます。
システムコマンドの実行結果をコードセルの変数に格納する。
例
res=!echo hello
print(res)
res=!python -c 'print("world")'
print(res[0])
['hello']
world
フォーム、Markdownを使う。
コードセルとテキストセルで使います。
インタラクティブなフォーム(公式の例↓のみで十分)
https://colab.research.google.com/notebooks/forms.ipynb
Markdown記法であれば大抵対応
https://colab.research.google.com/notebooks/markdown_guide.ipynb
よく使うコマンド
ファイルを作成・保存する。
%%writefile ファイルのパスをコードセルの1行目に書きます。
1行目以外のすべての行が、改行を維持したままファイルのパスへ保存されます。
例
%%writefile xxx.py
import time
time.sleep(1)
print("hello")
!python xxx.py
シェルコマンドechoを使います。
例
r=10
s=f"""
hoge={r}
fuga=20
""".strip()
!echo -n "$s" > xxx.txt
hoge=10
fuga=20
他にも直接ファイルをアップロードしたりすることができます。
bashモードで書く。
%%bashを1行目に書くことで、pythonモードからbashモードになります。
例
%%bash
sleep 3
echo hello world
hello world
その他シェルコマンドを使う。
cd、pip、nohupなど、多くのコマンドに対応しています。
例
%%writefile requirements.txt
streamlit
fastapi
!pip install -r requirements.txt
よくやる操作
セルの実行
選択中のコードセルでShift + Enter

コードセルの ▶ をクリック

メニューバーから、
ランタイム > すべてのセルを実行 or ランタイム > 現在のセルを実行
セルの実行停止
コードセルの ■ をクリック
一回で停止しない場合は、何回かクリックします。
停止するまでに遅延があるので、クリック連打による再実行に注意
メニューバーから、
ランタイム > 実行を中断
ランタイムを出荷時設定にリセットする。
何か上手くいかなかったときは再起動。
メニューバー > ランタイム > ランタイムを出荷時設定にリセット
すべてのローカル変数やファイルを含め、ランタイムの状態は保存されません。
ただし、追加したセルは保存されます。
起動中のセッションを終了する。
⑦セッションの状態 > セッションの管理 > 終了
Googleドライブをマウントする。
左ペイン > ファイルアイコンをクリック > ドライブアイコンをクリック
from google.colab import drive
drive.mount("/content/gdrive")
ファイルブラウザ or エディタを起動する。
ディレクトリ構造やファイルの中身を視認します。
画像ファイルを表示することもできます。
from google.colab import files
files.view("/content")
files.view("/content/xxx.txt")
#クォーテーションで囲まれたファイルやディレクトリの絶対パスの上に
#マウスのポインターを置き、出現したポップアップをクリック
print("/content")
左ペイン > ファイルアイコンをクリック > ファイルをダブルクリック
テキストエディタでは Ctrl+D などのショートカットキーが使えます。
ファイルのアップロードフォームを表示する。
from google.colab import files
uploaded = files.upload()
ローカルホストを出力する。
サーバーが立ち上がったかどうか確認するため、ローカルホストのURLを出力します。
from google.colab.output import eval_js
port=8010
eval_js(f"google.colab.kernel.proxyPort({port})").strip("/")
'https://--8010-colab.googleusercontent.com'
画像関連
コードセルの出力画面に画像を表示する。
IPythonを使います。(標準でインストール済みです。)
!pip show IPython
ローカルに保存した画像パスから画像を読み込む。
from IPython.display import Image,display_jpeg,display_png
display_jpeg(Image("sample.jpg"))
ローカルに保存せずに画像URLから表示する。
from IPython.display import Image,display_jpeg,display_png
img_url="https://dummyimage.com/100x50/6e6e6e/ffffff.jpg"
Image(url=img_url)
Image(url=img_url)は最後に実行する必要があります(空行やコメントアウト行を除く)。
画像URLから取得したバイナリデータをio.BytesIOに渡す。
from io import BytesIO
import requests
img_url="https://dummyimage.com/100x50/6e6e6e/ffffff.jpg"
img = BytesIO(requests.get(img_url,timeout=15).content)
# 表示する場合
#import IPython
#IPython.display.Image(img.getvalue())
IPython.display.Image(img)は最後に実行する必要があります(空行やコメントアウト行を除く)。
画像URLから画像を保存する。
from io import BytesIO
import requests
import IPython
img_url="https://dummyimage.com/100x50/6e6e6e/ffffff.jpg"
img = BytesIO(requests.get(img_url,timeout=15).content)
output="/content/sample.jpg"
with open(output, "wb") as f:
f.write(img.getvalue())
Pillowを使う。
from io import BytesIO
import requests
import IPython
import PIL
img_url="https://dummyimage.com/100x50/6e6e6e/ffffff.jpg"
img = BytesIO(requests.get(img_url,timeout=15).content)
output="/content/sample7.jpg"
img = PIL.Image.open(img)
img.save(output)
フレームワークとの連携
Streamlitを起動する。
#portはデフォルトで8051
!streamlit run app.py
#!streamlit run app.py --server.port=8030
ColabratoryではそのままではStreamlitの全機能を使うことができないので
ngrokかlocaltunnelでトンネルして起動します。
ngrokは最近よく失敗するのでlocaltunnelおすすめです。
ngrok、localtunnel共にローカルで実行中のアプリを外部公開するサービスなので、
公開URLを知っている人なら誰でもアクセスできてしまいます。
ngrokで
import nest_asyncio
from pyngrok import ngrok
ngrok_tunnel = ngrok.connect(8051)
host=ngrok_tunnel.public_url
nest_asyncio.apply()
print("Public URL:", host)
!streamlit run app.py
Public URL: http://********.ngrok.ioをクリックして移動。
Click to Continueボタンを押す。
localtunnelで
!streamlit run app.py & sleep 10 && npx localtunnel --port 8501
your url is: https://*****-*******-**.loca.ltをクリックして移動。
Click to Continueボタンを押す。
FastAPIを起動する。
from google.colab.output import eval_js
port=8030
eval_js(f"google.colab.kernel.proxyPort({port})").strip("/")
import uvicorn
!uvicorn.run(app=app, port=int(port),host="0.0.0.0")
https://***********-****************-8030-colab.googleusercontent.comに接続。
ngrokで
Streamlitを起動する。を参照。
localtunnelで
Streamlitを起動する。を参照。
localhostとして他のアプリケーションと連携したい場合のエンドポイントは、
http://localhost:[port番号]/です。
例:
Streamlitをlocaltunnelで + FastAPIをlocalhostで
ノートブック
準備中
予定のcolabノートブック
FastAPI(最小構成)
Streamlit+FastAPI(最小構成)
Streamlitページ遷移
Streamlitポップアップ
Streamlitページ遷移+ポップアップ
FastAPI+SqlAlchemy
ToDoアプリなどwebアプリ群
簡易サーバー起動 nohupも
-
ブラウザやバージョンにより挙動が異なることもあるようです。 ↩
