如何防止Google Colab断开连接?

318

有没有一种编程方式可以防止Google Colab在超时时断开连接?

以下是导致笔记本自动断开连接的条件:
Google Colab笔记本有90分钟的空闲超时和12小时的绝对超时。这意味着,如果用户在90分钟内不与他的Google Colab笔记本交互,则其实例会自动终止。此外,Colab实例的最长生命周期为12小时。
自然地,我们希望自动挤出实例的最大价值,而无需不断手动进行交互。这里我将假设常见的系统要求:
- Ubuntu 18.04 LTS(Bionic Beaver), Windows 10或Mac操作系统 - 在Linux系统中,使用流行的桌面环境,如GNOME 3或Unity - Firefox或Chromium浏览器
我应该在这里指出,这种行为不违反Google Colab的使用条款,尽管根据他们的FAQ(简而言之:如果您真的不需要,道德上不可以使用所有的GPU),这并不被鼓励。

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

  • 首先,我关闭屏幕保护程序,以便我的屏幕始终保持开启状态。
  • 我有一个Arduino板,所以我把它变成了一个橡胶鸭 USB设备,并让它在我睡觉时模拟原始的用户交互(只是因为我已经把它用于其他情况)。

是否有更好的方法?


3
90分钟的空闲超时... 如果用户在Google Colab笔记本上不进行交互超过90分钟,则其实例将自动终止。这很糟糕,因为这样就无法使用Kerastuner了。如果谷歌员工真的希望公众使用Kerastuner,他们需要想得更深入一些。 - Geoffrey Anderson
4
我该如何停止这段脚本的执行? - Murtaza Kamal
4
系统中的一个小重量和退格键可以帮你解决问题。希望你明白了! - Vikalp Jain
11
很遗憾,截至2021年3月,这些方法都已经不再起作用了。事实上,在打开会话约2-3个小时后,将弹出一个窗口,其中包含一个“非机器人”按钮。无论您在做什么(甚至在写作时),此窗口都会弹出。如果您未能点击该按钮,则会话在几分钟内结束。 - BestDogeStackoverflow
我的培训持续40分钟,但无论如何都无法进行。我希望空闲超时时间是你所说的90分钟。 - Christian Vincenzo Traina
39个回答

206

截至2021年3月,这些方法都已失效,因为Google添加了一个CAPTCHA按钮,在一段时间后会随机弹出。

在此之前,解决方案非常简单,不需要任何JavaScript。只需在底部创建一个新的单元格,其中包含以下行:

while True:pass

现在将单元格保持在运行序列中,以便无限循环不会停止,从而保持您的会话活动状态。

旧方法:

设置JavaScript间隔,每60秒点击连接按钮。

使用Ctrl+Shift+I打开开发人员设置(在您的网络浏览器中),然后单击控制台选项卡,并在控制台提示符上键入此内容。(对于Mac,请按Option+Command+I)

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

3
它说未捕获的类型错误:无法读取空值的“click”属性 在ConnectButton处 - Shaida Muhammad
3
看起来你的回答已经过时了。 - jgauth
7
在Chrome浏览器中,您可以创建一个书签以便在一次点击时运行该代码片段。只需创建一个带有以下URL的书签:javascript:void(setInterval(function(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); },60000))(相同命令的单行版本)。不确定此方法是否适用于其他浏览器。 - pdpino
1
我尝试了旧的方法,但出现了谷歌验证码,所以它没有起作用。哪种方法适用于当前的谷歌Colab? - maryam mehboob
2
测试于2022年2月12日,现已失效。 - Ian
显示剩余16条评论

68

由于连接按钮的ID现在已更改为“ colab-connect-button”,因此可以使用以下代码继续单击该按钮。

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

如果这仍然无法解决问题,则按照以下步骤操作:

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

7
根据新的按钮ID(2020年2月),这是目前的解决方案。 - Kaushal28
如果谷歌要尝试使此操作失效(例如,将其制作为类,并具有多个相同类别的虚假不可见按钮),则您始终可以选择不进行第三步:右键单击 --> 复制 --> 复制JS路径。 - Banjer_HD
5
我该如何停止这个脚本的执行? - Murtaza Kamal
3
@MurtazaKamal 按下 Ctrl + Shift + I,进入“Sources”并点击暂停按钮。 - Faisal Maqbool
1
它每分钟创建一个新单元格。 - kiranr
显示剩余2条评论

39

对我来说,以下例子:

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

第二个版本: 如果您希望能够停止函数,这里是新的代码:

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

我已经尝试了上述方法和其他几篇博客。到目前为止,与当今相关的是,你的两个代码都可以无误地运行。谢谢 :) - HarryS
“截至2021年3月,这些方法都已经失效”(https://dev59.com/dFMI5IYBdhLWcg3wFXWg?page=2&tab=createdasc#comment118402191_57113226) - Peter Mortensen
2023年:这段代码有效。 - simplyPTA
2023年:这段代码有效。 - undefined

29

好的,这对我有效:

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

Ctrl + Shift + I 打开检查器视图。然后转到控制台。

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

如何防止Colaboratory断开连接


1
谢谢,这对我也很有效。 (我上周在这里留下了相同的评论,但它消失了。不要丢失工作很重要,所以这个答案值得积极反馈。) - Geoffrey Anderson
无法工作,仍然断开连接。(使用Firefox浏览器74.0(64位)。) - hafiz031
即使您将浏览器窗口最小化并使用其他应用程序,这个方法是否仍然有效? - HarryS
“截至2021年3月,这些方法都已经无效”(https://dev59.com/dFMI5IYBdhLWcg3wFXWg?page=2&tab=createdasc#comment118402191_57113226) - Peter Mortensen

27

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

from pynput.mouse import Button, Controller
import time

mouse = Controller()

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

在您的桌面上运行此代码。然后将鼠标箭头指向(Colaboratory左侧面板 - 文件部分)目录结构中的任何目录。

此代码将每30秒钟点击一次该目录,因此每30秒钟它都会展开和收缩。这样您的会话就不会过期。

重要提示 - 您必须在您的PC上运行此代码。


我尝试过这个,当我导入pynput时出现了DisplayNameError。可能是因为我们只能通过浏览器(在托管的运行时会话中)访问colab,而不能使用键盘/鼠标等。 - HasnainMamdani
这个解决方案对我有效,只需要一个修改:不是点击文件目录,而是点击Colab页面上的评论图标,这将打开评论框,并在每30秒后关闭。 - bhanu pratap
同样地,我使用了SikuliX(一个带有预设用户输入自动化工具的Jython包装器)来自动化鼠标移动,这足够用了3个小时。它没有要求我填写验证码。只需将以下内容放入循环中:sleep(random.randint(50, 70)); mouseMove(randint(-20, 20), randint(-20, 20)) - Syncrossus

24

2020年8月,我不是点击 连接 按钮,而是点击 评论 按钮以保持我的会话活动状态。

function ClickConnect(){

    console.log("Working");
    document.querySelector("#comments > span").click()
}
setInterval(ClickConnect,5000)

12

我使用一个宏程序定期点击 RAM/Disk 按钮,让模型整夜训练。关键是要配置宏程序,使其在两次点击 Ram/Disk Colab 工具栏按钮之间有短暂间隔,以便即使运行时断开连接也能重新连接。(第一次点击用于关闭对话框,第二次点击用于重新连接)。 但是,你仍然需要整夜将笔记本电脑保持开启状态,可能还要固定 Colab 标签页。


11

之前的答案可能会通过一些脚本来解决问题。

我有一个解决方案(或者说是一种技巧),可以在不使用脚本的情况下解决这个令人烦恼的断开连接问题,特别是当你的程序必须从Google Drive中读取数据时,比如训练 深度学习 网络模型,使用脚本执行 reconnect 操作是无用的,因为一旦你与Colaboratory断开连接,程序就彻底死了。你需要手动重新连接到你的Google Drive,才能使你的模型能够再次读取数据集,但脚本将无法做到这一点。

我已经测试过很多次,它运行得很好。

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

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


我想补充一下你的答案,使用这个技巧在Firefox上也可以正常工作。但是对于我来说,我关闭了Mac的睡眠模式,并将浏览器窗口放在所有其他窗口的前面,就好像我正在积极地使用它一样。我整夜都保持这种状态,它仍然可以正常工作。没有任何JavaScript技巧可以解决这个问题。需要注意的是,我正在使用Google Colab Pro:所以我不确定这是否适用于免费的Colab。 - Yasser Sinjab
1
@Yasser Sinjab 感谢您的添加,我使用的是免费版本,它运行良好。 - Hu Xixi

10

也许之前的解决方案已经不再适用了。例如,下面的代码仍然可以在Colab中创建新的代码单元格,但这样做显然很麻烦。如果在运行的几个小时内创建了太多的代码单元格,并且没有足够的RAM,浏览器可能会冻结。

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

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

但是我发现以下代码有效,不会引起任何问题。 在Colab笔记本选项卡中,同时点击Ctrl + Shift + i键,并将以下代码粘贴到控制台中。 120000个间隔足够了。

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

我在2020年11月在 Firefox 中测试了这段代码。它也可以在 Chrome 上运行。


9

更新(2021年7月)。

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

1
更新什么?之前的回答中的代码?哪个回答?还是其他什么?它指的是什么? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接