Q:プログラムで Google Colab がタイムアウト時に切断されないようにする方法はありますか?
以下は、ノートブックが自動的に切断される原因となる状況について説明しています。
Google Colabノートブックのアイドルタイムアウトは90分、絶対タイムアウトは12時間です。つまり、ユーザーがGoogle Colabノートブックを90分以上操作しなかった場合、そのインスタンスは自動的に終了します。また、Colabインスタンスの最大寿命は12時間です。
当然、インスタンスから最大値を自動的に絞り出します 手動で絶えず操作する必要はありません 。ここでは、一般的に見られるシステム要件を想定します。
そのような振る舞いは違反しないGoogle Colabの利用規約 であることをここで指摘する必要がありますが、 [〜#〜] faq [〜#〜] (要するに、本当に必要ない場合、道徳的にすべてのGPUを使い果たすことはできません)。
私の現在の解決策は非常に愚かです:
もっと良い方法はありますか?
60秒ごとに接続ボタンをクリックするJavaScript間隔を設定します。 Ctrl + Shift + Iキーを押して(Webブラウザーで)developer-settingsを開き、コンソールタブをクリックして、コンソールプロンプトにこれを入力します。 (Macの場合はOption + Command + Iを押します)
function ConnectButton(){
console.log("Connect pushed");
document.querySelector("#connect").click()
}
setInterval(ConnectButton,60000);
まあこれは私のために働いています-
コンソールで次のコードを実行すると、切断できなくなります。 Ctrl + Shift + iでインスペクタービューを開きます。次に、コンソールに移動します。
function ClickConnect(){
console.log("Working");
document.querySelector("colab-toolbar-button#connect").click()
}
setInterval(ClickConnect,60000)
接続ボタンのIDが「colab-connect-button」に変更されたため、次のコードを使用してボタンをクリックし続けることができます。
function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("colab-connect-button").click()
}
setInterval(ClickConnect,60000)
それでも問題が解決しない場合は、以下の手順に従ってください。
function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("Put ID here").click() // Change id here
}
setInterval(ClickConnect,60000)
マクロプログラム を使用して、RAM /ディスクボタンを定期的にクリックし、モデルを一晩中トレーニングします。トリックは、ランタイムが切断された場合でも再接続されるように、2つのクリックの間に短い間隔でRam/Disk Colabツールバーボタンを2回クリックするようにマクロプログラムを構成することです。 (最初のクリックはダイアログボックスを閉じるために使用され、2回目のクリックは再接続に使用されました)。ただし、ラップトップを終夜開いたままにして、おそらくColabタブを固定する必要があります。
上記の答えは、いくつかのスクリプトの助けを借りてうまくいくかもしれません。特にプログラムがGoogleドライブからデータを読み取る必要がある場合、スクリプトを使用してreconnect
操作を実行するディープラーニングネットワークモデルをトレーニングする場合など、スクリプトを使用せずに煩わしい切断を解決する方法(または一種のトリック)があります。 colabとの接続を解除するとプログラムは無効になるため、モデルはデータセットを再度読み取ることができるようにもう一度Googleドライブに接続する必要がありますが、スクリプトはそれを実行しないため、役に立ちません。
すでに何度もテストしましたが、うまく機能しています。
ブラウザを使用してcolabページでプログラムを実行する場合(私はChromeを使用しています)、プログラムが実行を開始したら、次のようにブラウザに対して何の操作も行わないでください。 Webページ、別のWebページを開いたり閉じたりするなど、そのままにしてプログラムの実行が完了するのを待つだけで、pycharmなどの別のソフトウェアに切り替えて、コードを書き続けることができますが、別のWebページに切り替えることはできません。他のページを開いたり、閉じたり、他のページに切り替えたりすると、Google Colabページの接続の問題が発生する理由を知っていますが、検索ジョブなど、ブラウザを煩わしくするたびに、Colabへの接続がすぐに機能しなくなります。
python Seleniumの使用
from Selenium.webdriver.common.keys import Keys
from Selenium import webdriver
import time
driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')
notebook_url = ''
driver.get(notebook_url)
# run all cells
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.F9)
time.sleep(5)
# click to stay connected
start_time = time.time()
current_time = time.time()
max_time = 11*59*60 #12hours
while (current_time - start_time) < max_time:
webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform()
driver.find_element_by_xpath('//*[@id="top-toolbar"]/colab-connect-button').click()
time.sleep(30)
current_time = time.time()
pCにpythonコードを作成し、pynputを使用します
from pynput.mouse import Button, Controller
import time
mouse = Controller()
while True:
mouse.click(Button.left, 1)
time.sleep(30)
デスクトップでこのコードを実行し、任意のディレクトリで(コラボの左パネル-ファイルセクション)ディレクトリ構造の上にマウスの矢印を置くと、このコードは30秒ごとにディレクトリをクリックし続けるため、30秒ごとに拡大および縮小し、セッションが実行されなくなります。期限切れになる重要-このコードはPCで実行する必要があります
私にとっては次の例:
document.querySelector("#connect").click()
またはdocument.querySelector("colab-toolbar-button#connect").click()
またはdocument.querySelector("colab-connect-button").click()
エラーを投げていました。
私はそれらを以下に適応させなければなりませんでした:
バージョン1:
function ClickConnect(){
console.log("Connnect Clicked - Start");
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
console.log("Connnect Clicked - End");
};
setInterval(ClickConnect, 60000)
バージョン2:関数を停止できるようにしたい場合は、新しいコードを次に示します。
var startClickConnect = function startClickConnect(){
var clickConnect = function clickConnect(){
console.log("Connnect Clicked - Start");
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
console.log("Connnect Clicked - End");
};
var intervalId = setInterval(clickConnect, 60000);
var stopClickConnectHandler = function stopClickConnect() {
console.log("Connnect Clicked Stopped - Start");
clearInterval(intervalId);
console.log("Connnect Clicked Stopped - End");
};
return stopClickConnectHandler;
};
var stopClickConnect = startClickConnect();
停止するには、次を呼び出します:
stopClickConnect();
JavaScriptソリューションがもう機能しないと思います。私は自分のノートブックから次のようにしてそれをやっていました:
from IPython.display import display, HTML
js = ('<script>function ConnectButton(){ '
'console.log("Connect pushed"); '
'document.querySelector("#connect").click()} '
'setInterval(ConnectButton,3000);</script>')
display(HTML(js))
最初に「すべて実行」を実行すると(JavaScriptまたはPythonコードが開始する前に)、コンソールに次のように表示されます。
Connected to
wss://colab.research.google.com/api/kernels/0e1ce105-0127-4758-90e48cf801ce01a3/channels?session_id=5d8...
ただし、JavaScriptが実行されるたびに、console.log部分が表示されますが、クリック部分は単に次のようになります。
Connect pushed
Uncaught TypeError: Cannot read property 'click' of null
at ConnectButton (<anonymous>:1:92)
他の人は、ボタン名を#colab-connect-buttonに変更することを提案しましたが、同じエラーが発生します。
ランタイムが開始されると、ボタンがRAM/DISKを表示するように変更され、ドロップダウンが表示されます。ドロップダウンをクリックすると、新しい<DIV class=goog menu...>
以前はDOMに表示されていませんでしたが、「ホストランタイムに接続」と「ローカルランタイムに接続」という2つのオプションがあります。コンソールウィンドウが開いていて要素が表示されている場合、ドロップダウン要素をクリックすると、このDIVが表示されます。表示される新しいウィンドウの2つのオプション間でマウスフォーカスを移動するだけで、DOMに要素が追加されます。マウスがフォーカスを失うとすぐに、要素はクリックしなくてもDOMから完全に削除されます。
これは私のために働きました(ボタンのクラス名またはIDを変更したようです):
function ClickConnect(){
console.log("Working");
document.querySelector("colab-connect-button").click()
}
setInterval(ClickConnect,60000)
これを試して:
function ClickConnect(){
console.log("Working");
document
.querySelector("#top-toolbar > colab-connect-button")
.shadowRoot
.querySelector("#connect")
.click()
}
setInterval(ClickConnect,60000)
上記のコードを試しましたが、うまくいきませんでした。これが再接続用の私のJSコードです。
_let interval = setInterval(function(){
let ok = document.getElementById('ok');
if(ok != null){
console.log("Connect pushed");
ok.click();
}},60000)
_
これを同じ方法(ブラウザーのコンソールで実行)で使用して実行できます。スクリプトを停止する場合は、clearInterval(interval)
と入力して、再度実行したい場合はsetInterval(interval)
を実行します。
これがお役に立てば幸いです。
JQueryの使用をお勧めします(コラボにはデフォルトでJQueryが含まれているようです)。
function ClickConnect(){
console.log("Working");
$("colab-toolbar-button").click();
}
setInterval(ClickConnect,60000);
また、Pythonを使用して矢印キーを押すこともできます。次のコードにも少しランダム性を追加しました。
from pyautogui import press, typewrite, hotkey
import time
from random import shuffle
array = ["left", "right", "up", "down"]
while True:
shuffle(array)
time.sleep(10)
press('left')
press('right')
press('up')
press('down')