如何防止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个回答

4

在你想要运行的单元格之后运行以下代码,以避免数据丢失。

!python

同时,要退出此模式,请键入以下内容:

exit()


4
这段代码会在文件浏览器窗格中持续点击“刷新文件夹”的按钮。
function ClickRefresh(){
  console.log("Working"); 
  document.querySelector("[icon='colab:folder-refresh']").click()
}
const myjob = setInterval(ClickRefresh, 60000)

2
请注意,文件资源管理器/文件夹窗格必须展开才能使此功能起作用。 - Kel Solaar

4
以下 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 + Shift + I键。将脚本复制并粘贴到提示行中,然后在关闭编辑器之前按下Enter键。
通过这样做,该函数将每60秒检查一次是否显示屏幕连接对话框,如果是,则函数会自动为您点击OK按钮。

4
最被赞同的答案对我来说确实有效,但它会使“管理会话”窗口一次又一次地弹出。
我通过使用浏览器控制台自动单击刷新按钮来解决这个问题,方法如下。
function ClickRefresh(){
    console.log("Clicked on refresh button"); 
    document.querySelector("paper-icon-button").click()
}
setInterval(ClickRefresh, 60000)

欢迎在此gist https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e 贡献更多代码片段。


3

尝试以下方法,避免在模拟每分钟单击工具栏连接按钮时出现所有烦人的对话框。您只需将此复制粘贴到控制台中,调用该方法,即可在笔记本上工作。

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

3

我建议使用jQuery(似乎Colaboratory默认包含jQuery)。

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

这个不起作用:Uncaught ReferenceError: $ is not defined at ClickConnect (<anonymous>:3:3) - Kel Solaar

3

我有一个关于这些JavaScript函数的问题:

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

在按钮实际点击之前,它们会在控制台上打印“点击连接按钮”。

如你所见,自从Google Colab推出以来,连接按钮的ID已经改变了几次。并且将来也可能会更改。

因此,如果您要复制旧答案回答这个问题,它可能会说“点击连接按钮”,但实际上可能不是这样。当然,如果点击失败,它将在控制台上打印错误消息,但如果您偶然看不到该消息怎么办?

因此,最好这样做:

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

你一定会看到它是否真正起作用了。


3

嗯,我不是Python专家,也不知道'Colab'的实际用途。我将其用作构建系统,哈哈。我曾经在其中设置ssh转发,然后放置这段代码并让它运行,没错,它起作用了。

import getpass
authtoken = getpass.getpass()

它是如何工作的?当我执行一个需要很长时间的单元格时,无法运行另一个单元格,例如获取密码。 - matt91t

3
以下最新的解决方案适用于我:
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)

2
请考虑在您的答案中包含解释。 - Suraj

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

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