これまで、Kaggleのカーネルから他のカーネルのscript(コード)をimportすることはできませんでした。
今回のアップデートで、ノートブックカーネルであれば、scriptをimportすることができるようになりました。
これまでは同じコードを繰り返し書いていましたが、共通の処理はscriptで書いておいて、カーネルに書くコードを減らすという使い方ができそうです。
使い方
使い方は、次のツイートで書いた通り。
kaggleのノートブックカーネルにスクリプトをimportできるようになった!これはとても便利!!https://t.co/rxkfG0iQeX
— カレー🍛 (@currypurin) 2019年5月2日
手順は
・scriptを書いて、settingsのUtility Scriptをonにする
・ノートブックのFileのAdd utility scriptからscriptを選択
・importする
と簡単。 pic.twitter.com/6a3UokBxus
公式からは次のように説明がありました。
- Create a script kernel with the code you’d like to import. For some ideas on how to organize this, check out this documentation on Python modules or this guide to writing code for R packages.
- In the settings panel on the right hand side, select “Utility Script On” from the Utility drop down. This will let you import this script to notebook kernels.
- Commit your script. When you import a script, you’re importing the most recent committed version. If you haven’t committed a version yet, you won’t see it in the list of scripts you can import.
- Open the notebook where you’d like to import the script.
- Add the script. Under “File”, click “Add utility script”. Search for the script you want and click to add it. You should see it listed under “usr/lib” in the panel on the right hand side.
- Import your script. In Python you can do this using import nameof_script. In R, you can do this using source(“path/to/script”). The path will be like ../usr/lib/[your_script_name_here]/[your_script_name_here.R]. You can use the TAB button as you type the path to automatically fill out the file path.
- Use the functions or objects you’ve imported!
実際に使ってみる
Kernelの実行終了時にLineに通知を送るコードをscriptにしてみました。
コピペで使える。Kaggleでの実験を効率化する小技まとめのLINEに通知を送るで紹介されているやつですね。
line_tokenが色々なところに散らばるのを防ぐためにも、scriptにしてimportして使うというのは良い気がします。
import requests def send_line_notification(message): line_token = 'YOUR_LINE_TOKEN' # 終わったら無効化する endpoint = 'https://notify-api.line.me/api/notify' message = "\n{}".format(message) payload = {'message': message} headers = {'Authorization': 'Bearer {}'.format(line_token)} requests.post(endpoint, data=payload, headers=headers)
scriptでは、上記ブログの通りにパーソナルアクセストークンをを発行して'YOUR_LINE_TOKEN'を発行されたトークンに置き換えます。
そして、他のカーネルからimportできるようにするために、settingsのUtility Scriptをonにしておきます。
次にノートブックのカーネルを開き、FileにあるAdd utility scriptから、先ほど作ったscriptを選択します。
また、通知はinternetアクセスが必要なため、Settingsにあるinternetをonにします。
あとは次のようにimportして、'send_line_notification()'すると、Lineに通知が行きます。
from line_notify import send_line_notification send_line_notification('test_notify')
とても簡単です。素晴らしい。
この情報を知った経緯など
次のツイートでできるようになったことを知りました。
Y'all I'm sooo happy to announce this... 🤩
— Rachael Tatman (@rctatman) 2019年5月1日
You can now import scripts into notebooks on Kaggle. No more copying & pasting code into a gillion different notebooks. Just add your script & import. 🪐📒
I'm gonna modularize alll the things.📦😎
More deets: https://t.co/pW6CGlxhLq
Kaggleのカーネル実行終了時に通知できないのかなーとつぶやいていたら、higeponさんにインターネットアクセスをonにしないといけないと教えてもらいました。
kaggleのカーネルからmail若しくはlineの通知を送るってできないんでしたっけ?
— カレー🍛 (@currypurin) 2019年5月2日
学習が終わった段階で、通知が欲しい。
https://t.co/Mmts1Bn69p でまとめられています。ただし Internet access を有効にする必要があります(そして某Kernelコンペでは有効にすると submit できなくなる)
— higepon (@HigeponJa) 2019年5月2日
ありがとうございます!!
— カレー🍛 (@currypurin) 2019年5月2日
Internet accessを有効にする必要があったんですね!知らなかったので、とても助かりました!
これから少しKernelコンペに手を出してみようと思ったところだったので、有効にするとsubmitできなくなるコンペがあるとは。。。試してみます。
No internet access enabledとされている、Kernelコンペでは、インターネットアクセスをonにしていると、Kernelからサブミットできないようです。
Freesoundコンペは、インターネットアクセスonにしているとサブミットさえできないんコンペと。
— カレー🍛 (@currypurin) 2019年5月2日
画像のように表示されたから、importしたカーネルもインターネットアクセスはoffじゃないとダメ。
>No internet access enabled
だから当然なのかもしれないけれど、サブミットはさせてくれても良いのに pic.twitter.com/tfwlQeAppn