如何防止谷歌Colab断开连接?

是否有一种方法以编程方式防止谷歌Colab超时断开连接?

笔记本电脑自动断开连接的情况如下:

谷歌Colab笔记本的空闲超时为90分钟,绝对超时为12小时。这意味着,如果用户没有与他的谷歌Colab笔记本进行交互超过90分钟,其实例将自动终止。此外,Colab实例的最大生存期为12小时。

自然,我们希望自动从实例而不需要经常手动与它交互中挤出最大值。这里我将假设常见的系统需求:

我应该在这里指出,这样的行为不违反 谷歌Colab的使用条款,尽管根据他们的常见问题解答,这是不鼓励的(简而言之:道德上是不可以用完所有的gpu,如果你真的不需要它)。


我目前的解决方案非常愚蠢:

  • 首先,我把屏保关掉,这样我的屏幕就一直开着。
  • 我有一个Arduino板,所以我只是把它变成了一个橡皮鸭USB设备,让它在我睡觉的时候模拟原始的用户交互(只是因为我手头有其他用例)。

有没有更好的办法?

305600 次浏览

我使用宏程序定期单击RAM/Disk按钮来整晚训练模型。诀窍是配置一个宏程序,点击Ram/Disk Colab工具栏按钮两次,两次点击之间的间隔很短,这样即使运行时断开连接,它也会重新连接回来。(第一次点击用于关闭对话框,第二次点击用于重新连接)。 然而,你还是得整晚打开笔记本电脑,可能还得固定Colab标签。< / p >

截至2021年3月,这些方法都将无效,因为谷歌添加了一个验证码按钮,该按钮在一段时间后随机弹出。

在此之前,解决方案非常简单,不需要任何JavaScript。只需要在底部创建一个新单元格,内容如下:

while True:pass

现在将单元格保持在运行序列中,这样无限循环就不会停止,从而使会话保持活动状态。

老方法:

设置JavaScript间隔,每60秒单击一次连接按钮。

用Ctrl+Shift+I打开开发者设置(在您的web浏览器中),然后单击控制台选项卡,并在控制台提示符上键入此选项卡。(mac按Option+Command+I键)

function ConnectButton(){
console.log("Connect pushed");
document.querySelector("#top-toolbar > colab-connectbutton").shadowRoot.querySelector("#connect").click()
}
setInterval(ConnectButton,60000);

使用Python :

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()

我不相信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))

当你第一次执行Run all(在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)

其他人建议按钮名称已更改为# coab -connect-button,但这也会产生相同的错误。

启动运行时后,按钮更改为显示RAM/DISK,并显示下拉列表。点击下拉列表创建一个新的<DIV class=goog menu...>,它之前没有显示在DOM中,有两个选项"连接到托管运行时"和“连接到本地运行时”。如果控制台窗口打开并显示元素,则在单击下拉元素时可以看到这个DIV。只需将鼠标焦点在出现的新窗口中的两个选项之间移动,就会向DOM添加额外的元素,一旦鼠标失去焦点,它们就会从DOM中完全删除,甚至不需要单击。

这对我来说很管用:

在控制台中运行以下代码,它将阻止您断开连接。

Ctrl + 转变 + 打开检查器视图。然后去控制台。

function ClickConnect(){
console.log("Working");
document.querySelector("colab-toolbar-button#connect").click()
}
setInterval(ClickConnect,60000)

如何防止协作实验室断开连接

在你的PC上使用pynput创建Python代码:

from pynput.mouse import Button, Controller
import time


mouse = Controller()


while True:
mouse.click(Button.left, 1)
time.sleep(30)

在桌面上运行这段代码。然后将鼠标箭头指向(协作实验室的左面板-文件部分)任意目录上的目录结构。

这段代码将每30秒继续单击目录,因此它将每30秒展开和收缩一次。因此您的会话不会过期。

重要的是,你必须在你的PC上运行这段代码。

在一些脚本的帮助下,前面的答案可能工作得很好。

我有一个解决方案(或一种技巧),对于没有脚本的恼人的断开连接,特别是当你的程序必须从你的谷歌驱动器读取数据时,比如训练一个深度学习网络模型,其中使用脚本来做reconnect操作是没有用的,因为一旦你与协作实验室断开连接,程序就死了。您应该手动连接到您的谷歌驱动器再次使您的模型能够再次读取数据集,但脚本不会做这件事。

我已经测试过很多次了,效果很好。

当你用浏览器(我使用Chrome)在协作页面上运行程序时,只要记住,一旦程序开始运行,就不要对浏览器做任何操作,比如:切换到其他网页,打开或关闭另一个网页,等等。只要把它放在那里,等待你的程序完成运行。你可以切换到另一个软件,比如PyCharm来继续写你的代码,但不能切换到另一个网页。

我不知道为什么打开或关闭或切换到其他页面会导致协作页面的连接问题,但每次我试图打扰我的浏览器,比如做一些搜索工作,我与协作页面的连接很快就会中断。

我尝试了之前答案中的代码,但它们不适合我。这里是重新连接的JavaScript代码。

let interval = setInterval(function(){
let ok = document.getElementById('ok');
if(ok != null){
console.log("Connect pushed");
ok.click();
}},60000)

您可以以同样的方式使用它(在浏览器的控制台上运行)来运行它。

如果你想停止脚本,你可以输入clearInterval(interval)并想再次运行setInterval(interval)

这一个为我工作(似乎他们改变了按钮的类名或id):

function ClickConnect(){
console.log("Working");
document.querySelector("colab-connect-button").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)

如果还是不行,那就按照下面的步骤来做:

  1. 右键单击连接按钮(在colab的右上角)
  2. 点击inspect
  3. 获取按钮的HTML id并在以下代码中进行替换
function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("Put ID here").click() // Change id here
}
setInterval(ClickConnect,60000)

试试这个:

function ClickConnect(){
console.log("Working");
document
.querySelector("#top-toolbar > colab-connect-button")
.shadowRoot
.querySelector("#connect")
.click()
}


setInterval(ClickConnect,60000)

对我来说,以下是一些例子:

  • 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();

我推荐使用jQuery(似乎collaboratory默认包含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(array[0])
press(array[1])
press(array[2])
press(array[3])
function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("connect").click() // Change id here
}
setInterval(ClickConnect,60000)

试试上面的代码。这对我很有用:)

我有一个问题与这些JavaScript函数:

function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("colab-connect-button").click()
}
setInterval(ClickConnect, 60000)

他们打印“点击连接按钮”;在实际单击按钮之前。

从这个问题的不同答案中可以看出,自从谷歌Colab推出以来,连接按钮的id已经改变了几次。将来也可能会改变。

因此,如果你要复制这个问题的旧答案,它可能会说“点击连接按钮”,但实际上它可能不会这样做。当然,如果单击不起作用,它将在控制台上打印一个错误,但是如果您可能不会意外地看到它呢?

所以你最好这样做:

function ClickConnect(){
document.querySelector("colab-connect-button").click()
console.log("Clicked on connect button");
}
setInterval(ClickConnect,60000)

你一定会看到它是否真的有效。

我一直在寻找一个解决方案,直到我发现了一个Python 3脚本,它随机地来回移动鼠标并单击,总是在同一个地方。但这足以骗过协作实验室,让它以为我在笔记本上活动,它不会断开连接。

import numpy as np
import time
import mouse
import threading


def move_mouse():
while True:
random_row = np.random.random_sample()*100
random_col = np.random.random_sample()*10
random_time = np.random.random_sample()*np.random.random_sample() * 100
mouse.wheel(1000)
mouse.wheel(-1000)
mouse.move(random_row, random_col, absolute=False, duration=0.2)
mouse.move(-random_row, -random_col, absolute=False, duration = 0.2)
mouse.LEFT
time.sleep(random_time)




x = threading.Thread(target=move_mouse)
x.start()

你需要安装所需的包:sudo -H pip3 install <package_name>

你只需要用sudo运行它(在你的本地机器上)(因为它控制了鼠标),它应该可以工作,让你充分利用协作实验室的12小时会话。

学分: 对于那些使用Colab (Pro):防止会话由于不活动而断开连接

function ClickConnect()
{
console.log("Working....");
document.querySelector("paper-button#comments").click()
}
setInterval(ClickConnect, 600)

这对我很有效,但要明智地使用它。

下面的最新的解决方案适用于我:

function ClickConnect(){
colab.config
console.log("Connnect Clicked - Start");
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
console.log("Connnect Clicked - End");
};
setInterval(ClickConnect, 60000)

下面的JavaScript代码适合我。感谢@artur.k.space

function ColabReconnect() {
var dialog = document.querySelector("colab-dialog.yes-no-dialog");
var dialogTitle = dialog && dialog.querySelector("div.content-area>h2");
if (dialogTitle && dialogTitle.innerText == "Runtime disconnected") {
dialog.querySelector("paper-button#ok").click();
console.log("Reconnecting...");
} else {
console.log("ColabReconnect is in service.");
}
}
timerId = setInterval(ColabReconnect, 60000);

在Colab笔记本中,同时按Ctrl + 转变 + 键。将脚本复制并粘贴到提示行中。然后在关闭编辑器之前点击输入

通过这样做,该函数将每60秒检查一次,看看是否显示屏幕上的连接对话框,如果是,该函数将自动为您单击好吧按钮。

只需在想要运行以防止数据丢失的单元格后运行下面的代码。

!python

另外,要退出此模式,请写入

exit()

好吧,我不是一个Python人,我也不知道这个“Colab”的实际用途是什么。我把它作为一个构建系统,哈哈。我曾经在里面设置ssh转发,然后放这个代码,让它运行,是的,它可以工作。

import getpass
authtoken = getpass.getpass()

这对我来说很管用:

function ClickConnect(){
console.log("Working");
document.querySelector("paper-icon-button").click()
}
Const myjob = setInterval(ClickConnect, 60000)

如果不工作,试着通过运行:

clearInterval(myjob)

我没有单击连接按钮,而是单击评论按钮来保持会话存活(2020年8月):

function ClickConnect(){


console.log("Working");
document.querySelector("#comments > span").click()
}
setInterval(ClickConnect,5000)
投票最多的答案当然适合我,但它使管理会话窗口一次又一次地弹出。
我已经解决了这个问题,使用浏览器控制台自动单击刷新按钮,如下

function ClickRefresh(){
console.log("Clicked on refresh button");
document.querySelector("paper-icon-button").click()
}
setInterval(ClickRefresh, 60000)

请随意在这个要点https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e上贡献更多的代码片段

此代码继续点击“刷新文件夹”;在文件资源管理器窗格中。

function ClickRefresh(){
console.log("Working");
document.querySelector("[icon='colab:folder-refresh']").click()
}
const myjob = setInterval(ClickRefresh, 60000)

GNU Colab让你在一个协作实例上运行一个标准的持久桌面环境。

事实上,它包含了一种机制,不让机器空转死亡。

这是一个视频演示

也许以前的许多解决方案不再有效。例如,下面的代码继续在Colab中创建新的代码单元格,但仍然有效。毫无疑问,创建一堆代码单元是不方便的。如果在运行的几个小时内创建了太多的代码单元,并且没有足够的RAM,浏览器可能会冻结。

这将重复创建代码单元格-

function ClickConnect(){
console.log("Working");
document.querySelector("colab-toolbar-button").click()
}setInterval(ClickConnect,60000)

但我发现下面的代码是工作的,它不会引起任何问题。在Colab notebook选项卡中,同时单击Ctrl + Shift + i键并将下面的代码粘贴到控制台中。120000个间隔就足够了。

function ClickConnect(){
console.log("Working");
document.querySelector("colab-toolbar-button#connect").click()
}setInterval(ClickConnect,120000)

我在2020年11月在firefox中测试了这段代码。它也会在铬上工作。

尝试这样做可以避免在您尝试模拟每分钟单击工具栏连接按钮时出现所有恼人的对话框。你可以复制粘贴到你的控制台,调用这个方法,你就可以在笔记本上工作了。

function connectRefresher() {
window.ConnectButtonIntervalId = setInterval(function ConnectButton(){
console.log("connected");
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
document.querySelector("colab-sessions-dialog").shadowRoot.querySelector("#footer > div > paper-button").click();
console.log("closed the dialog!!");
},60000);
}
    

function clearRefresher() {
console.log("clear Interval called !!");
clearInterval(window.ConnectButtonIntervalId);
}


connectRefresher(); //to connect the refresher
clearRefresher(); //to disconnect the refresher
var startColabHandler = function startColabHandler(interval = 60000, enableConnectButton = false) {
console.log("colabHandler - configure - start: " + new Date());
    

var colabClick = function colabClick() {
console.log("colabHandler - click - start: " + new Date());
        

if (enableConnectButton === true) {
var button1 = document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect");
            

if (button1) {
button1.click()
}
}
        

button2 = document.querySelector("html body colab-dialog.yes-no-dialog paper-dialog div.buttons paper-button#ok");
        

if (button2) {
button2.click()
}
        

console.log("colabHandler - click - end: " + new Date());
};


var intervalId = setInterval(colabClick, interval);


window.stopColabHandler = function stopColabHandler() {
console.log("colabHandler - stop - start: " + new Date());
        

clearInterval(intervalId);
        

console.log("colabHandler - stop - start: " + new Date());
};


console.log("colabHandler - configure - end: " + new Date());
};

好吧,我找到了一个很好的解决办法,可以摆脱

活动会话

自动弹出。我们需要两个函数,

与前面的步骤相同。Inspect>控制台比;逐个粘贴函数

1

function clickConnect() {
try {
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
// this also works, if above one doesn't work, comment it and uncomment below one
//document.querySelector("colab-connect-button").shadowRoot.getElementById('connect').click();
setTimeout(clickDismiss, 500);
console.log("Keeping Colab Alive!");
} catch (error) {
console.log(error);
}
}

2

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

3.

async function clickDismiss() {
    

try {
        

// click manage session button
document.querySelector("colab-usage-display").shadowRoot.querySelector("paper-button").click();
    

} catch (error) {
console.log(error);
}
    

try {
// leave from manage session window
await sleep(1000);
document.querySelector('colab-sessions-dialog').shadowRoot.querySelector('.dismiss').click();
} catch (error) {
console.log(error);
}
    

try {
// click close button
await sleep(1000);
document.querySelector("paper-tab").querySelector("paper-icon-button").shadowRoot.getElementById('icon').click();
} catch (error) {
console.log(error);
}
    

}

4

setInterval(ClickConnect, 60000);

编辑:

所以,如果你不喜欢手动做所有这些事情,有一种方法来自动化所有这些!

Way_1。使用这个Chrome扩展并完成

Way_2。

  1. 使用Page-Manipulator扩展
  2. 点击它,然后点击添加Java脚本按钮>+新+ >文件名
  3. 文件名为ColabAlive >使
  4. 活动网站= colab.research.google.com
  5. 匹配的页面= 递归
  6. 然后使用下面的代码,

// 1
function clickConnect() {
try {
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click();
// this also works, if above one doesn't work, comment it and uncomment below one
//document.querySelector("colab-connect-button").shadowRoot.getElementById('connect').click();
setTimeout(clickDismiss, 500);
console.log("Keeping Colab Alive!");
} catch (error) {
console.log(error);
}
}


//2
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}


//3
async function clickDismiss() {


try {


// click manage session button
document.querySelector("colab-usage-display").shadowRoot.querySelector("paper-button").click();


} catch (error) {
console.log(error);
}


try {
// leave from manage session window
await sleep(1000);
document.querySelector('colab-sessions-dialog').shadowRoot.querySelector('.dismiss').click();
} catch (error) {
console.log(error);
}


try {
// click close button
await sleep(1000);
document.querySelector("paper-tab").querySelector("paper-icon-button").shadowRoot.getElementById('icon').click();
} catch (error) {
console.log(error);
}


}
//4
setInterval(clickConnect, 60000);

  1. 点击活动,然后重新加载>完成

这要归功于Oshayr, Albert Einstein和每个人谁张贴他们的解决方案在这里。

你可以收藏笔记本,让它保持联系:

function ClickConnect(){
console.log("Clicked on star button");
document.querySelector("iron-icon#star-icon").click()
}
setInterval(ClickConnect, 60000)

现在你每分钟都能看到星星的闪烁。

更新(2021年7月)。

function ConnectButton(){
console.log("Working");
document.querySelector("#connect").click()
}
setInterval(ConnectButton, 60000);

YouTube视频中的解决方案“< a href = " https://youtu。be/78rSqtkw3Gk" rel="nofollow noreferrer">如何防止谷歌Colab断开|一个简单的解决方案"对我有用。

安装pynput库,它允许您控制和监视输入设备。

pip install pynput

现在,在您的本地机器上执行这段代码,并将鼠标光标放在正在运行的Colab笔记本中的一个空单元格中。

from pynput.mouse import Controller,Button
import time


mouse = Controller()


while True:
mouse.click(Button.left,1)
print('clicked')


time.sleep(5)

这仅适用于使用Ipywidget库的人。如果你不这样做,它可能对你没有用处。

禁止使用Ipywidgets。

Ipywidgets和它们准备按钮、文本字段等的类似包,在Jupiter或Colab中运行后完成一个单元格。

Colab保存你最后一次运行单元的时间,如果你用这些包训练你的模型,那么它会认为你是空闲的,所以30分钟后它会让你断开连接。

Like this

当所有这些都失败时,你可以通过订阅谷歌Colab Pro+来获得后台执行