248

问:有什么方法可以以编程方式防止Google Colab超时断开连接?

下面介绍导致笔记本自动断开连接的情况:

Google Colab 笔记本的空闲超时时间为 90 分钟,绝对超时时间为 12 小时。这意味着,如果用户超过 90 分钟未与他的 Google Colab 笔记本交互,则其实例将自动终止。此外,Colab 实例的最长生命周期为 12 小时。

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

  • Ubuntu 18 LTS / Windows 10 / Mac 操作系统
  • 对于基于 Linux 的系统,使用流行的 DE,如 Gnome 3 或 Unity
  • Firefox 或 Chromium 浏览器

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


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

  • 首先,我关闭了屏幕保护程序,所以我的屏幕一直亮着。
  • 我有一个 Arduino 板,所以我只是把它变成了一个橡皮鸭 USB,让它在我睡觉时模拟原始的用户交互(只是因为我手头有它用于其他用例)。

有没有更好的方法?

4

35 回答 35

183

编辑 2: 截至 2021 年 3 月,这些方法都不起作用,因为谷歌添加了一个在一段时间后随机弹出的验证码按钮。

编辑1: 显然解决方案非常简单,不需要任何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);
于 2019-10-07T18:40:18.823 回答
63

由于连接按钮的 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 并替换为以下代码
function ClickConnect(){
    console.log("Clicked on connect button"); 
    document.querySelector("Put ID here").click() // Change id here
}
setInterval(ClickConnect,60000)
于 2020-02-25T05:52:29.510 回答
35

对我来说,以下示例:

  • 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();
于 2020-03-07T15:27:12.940 回答
28

好吧,这对我有用-

在控制台中运行以下代码,它将阻止您断开连接。Ctrl+ Shift + i 打开检查器视图。然后去控制台。

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

如何防止google colab断开连接

于 2019-11-25T06:23:38.060 回答
23

使用 pynput 在你的电脑中创建一个 python 代码

from pynput.mouse import Button, Controller
import time

mouse = Controller()

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

在您的桌面上运行此代码,然后将鼠标箭头指向任何目录上的(colabs 左侧面板 - 文件部分)目录结构此代码将每 30 秒持续单击一次目录,因此它将每 30 秒扩展和缩小一次,因此您的会话不会过期重要 - 您必须在您的电脑上运行此代码

于 2019-12-30T08:24:50.077 回答
22

而不是点击连接按钮,我只是点击评论按钮来保持我的会话活跃。(2020 年 8 月)

function ClickConnect(){

console.log("Working"); 
document.querySelector("#comments > span").click() 
}
setInterval(ClickConnect,5000)
于 2020-08-21T10:51:49.097 回答
12

我使用宏程序定期单击 RAM/磁盘按钮整夜训练模型。诀窍是配置一个宏程序以两次单击 Ram/Disk Colab 工具栏按钮,两次单击之间的间隔很短,这样即使运行时断开连接,它也会重新连接。(第一次单击用于关闭对话框,第二次单击用于重新连接)。但是,您仍然必须让您的笔记本电脑整夜打开,并可能固定 Colab 选项卡。

于 2019-07-19T14:42:30.357 回答
11

上面的答案在一些脚本的帮助下可能效果很好。对于没有脚本的烦人断开连接,我有一个解决方案(或一种技巧),特别是当您的程序必须从您的谷歌驱动器中读取数据时,例如训练深度学习网络模型,使用脚本进行reconnect操作是没有用的,因为曾经你与你的 colab 断开连接,程序就死了,你应该再次手动连接到你的谷歌驱动器,以使你的模型能够再次读取数据集,但脚本不会这样做。

我已经对其进行了多次测试,并且效果很好。

当你用浏览器(我用的是 Chrome)在 colab 页面上运行程序时,只要记住程序开始运行后不要对浏览器进行任何操作,例如:切换到其他网页,打开或关闭另一个网页,以及以此类推,只需将其放在那里等待程序运行完毕,就可以切换到其他软件,例如 pycharm 继续编写代码,但不能切换到其他网页。我不知道为什么打开或关闭或切换到其他页面会导致google colab页面的连接问题,但每次我尝试打扰我的浏览器,比如做一些搜索工作,我与colab的连接很快就会中断。

于 2019-12-31T02:11:04.583 回答
10

尝试这个:

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

setInterval(ClickConnect,60000)
于 2020-03-06T06:40:10.110 回答
9

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

这会重复创建代码单元——</sub>

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 中测试了此代码。它也适用于 chrome。

于 2020-11-15T06:53:12.773 回答
8

我不相信 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 部分,但 click 部分只是给出:

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。只需在出现的新窗口中的两个选项之间移动鼠标焦点,就会向 DOM 中添加额外的元素,一旦鼠标失去焦点,它们就会从 DOM 中完全移除,即使没有单击也是如此。

于 2019-11-22T18:10:33.727 回答
7

使用 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()
于 2019-10-28T13:22:08.087 回答
6

我尝试了上面的代码,但它们对我不起作用。所以这是我用于重新连接的 JS 代码。

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

您可以以相同的方式使用它(在浏览器的控制台上运行它)来运行它。如果要停止脚本,可以输入clearInterval(interval)并想再次运行setInterval(interval)

我希望这可以帮助你。

于 2020-01-04T09:51:48.233 回答
5

这对我有用(似乎他们更改了按钮类名或 id):

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

于 2020-02-21T11:33:01.130 回答
5

更新了一个。这个对我有用。

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

如果对你们不起作用,请尝试通过运行清除它:

clearInterval(myjob)

于 2020-08-10T16:19:36.917 回答
4

投票最多的答案当然对我有用,但它使“管理会话”窗口一次又一次地弹出。
我已经通过使用如下浏览器控制台自动单击刷新按钮解决了这个问题

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

请随时在此要点https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e上为此提供更多片段

于 2020-09-02T11:49:29.053 回答
4

您可以为笔记本添加书签以使其保持连接状态

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

现在你可以看到每分钟闪烁的星星。

于 2021-04-18T07:26:48.333 回答
4

GNU Colab允许您在 Colaboratory 实例之上运行标准的持久桌面环境。

实际上,它包含一种机制,不会让机器因空转而死。

这是一个视频演示

于 2020-10-03T01:58:33.577 回答
4

好的,我找到了一个很好的解决方案,可以摆脱

活动会话

自动弹出。为此,我们需要 2 个函数,

与之前相同的程序。检查>控制台>粘贴功能一一

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。使用此Chrome 扩展程序并完成

或者

方式_2。

  1. 使用Page-Manipulator扩展
  2. 单击它,然后单击添加 Java 脚本按钮 > + 新建 + > 文件名
  3. 说文件名是 ColabAlive > Make
  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和所有在此处发布解决方案的人。

于 2021-03-23T20:03:48.380 回答
4

下面 youtube 链接中的这个解决方案对我有用。安装允许您控制和监视输入设备的 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)

https://youtu.be/78rSqtkw3Gk

于 2021-09-13T17:57:59.777 回答
4

更新(7 月 21 日)。

function ConnectButton(){ 
    console.log("Working"); 
    document.querySelector("#connect").click() 
}
setInterval(ConnectButton,60000);
于 2021-07-29T18:31:03.163 回答
3

此代码不断单击文件资源管理器窗格中的“刷新文件夹”。

function ClickRefresh(){
  console.log("Working"); 
  document.querySelector("[icon='colab:folder-refresh']").click()
}
const myjob = setInterval(ClickRefresh, 60000)
于 2020-09-21T07:58:48.890 回答
3
function ClickConnect()
{
    console.log("Working...."); 
    document.querySelector("paper-button#comments").click()
}
setInterval(ClickConnect,600)

这对我有用,但要明智地使用

快乐学习:)

于 2020-06-28T12:56:57.217 回答
3

只需在要运行的单元格之后运行以下代码即可避免数据丢失。

!python

同样要退出此模式,请编写

exit()
于 2020-08-04T11:42:55.370 回答
3

我建议使用 JQuery(似乎 Co-lab 默认包含 JQuery)。

function ClickConnect(){
  console.log("Working");
  $("colab-toolbar-button").click();
}
setInterval(ClickConnect,60000);
于 2020-03-16T13:45:53.280 回答
3

好吧,我不是 python 人,也不知道这个“Colab”的实际用途是什么,我将它用作构建系统,哈哈。我曾经在其中设置 ssh 转发,然后放入此代码并让它运行,是的,它可以工作。

import getpass
authtoken = getpass.getpass()
于 2020-08-08T08:52:03.707 回答
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)
于 2020-07-05T11:42:39.703 回答
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
于 2021-02-16T10:33:22.420 回答
3

下面的 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自动为您单击按钮。

于 2020-07-07T02:12:28.627 回答
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)

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

于 2020-05-12T10:56:22.427 回答
2

您也可以使用 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])
于 2020-03-16T20:57:04.833 回答
2

我一直在寻找解决方案,直到我发现一个 Python3 随机来回移动鼠标并单击,总是在同一个地方,但这足以让 Colab 认为我在笔记本上处于活动状态并且不会断开连接。

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(因为它控制了鼠标),它应该可以工作,让您充分利用 Colab 的 12 小时会话。

致谢: 对于使用 Colab (Pro) 的用户:防止 Session 由于不活动而断开连接

于 2020-06-04T22:22:30.677 回答
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());
};
于 2021-02-18T16:48:56.383 回答
1
function ClickConnect(){
    console.log("Clicked on connect button"); 
    document.querySelector("connect").click() // Change id here
}
setInterval(ClickConnect,60000)

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

于 2020-05-05T08:03:03.340 回答
0

防止使用 Ipywidgets。
Ipywidgets 和他们准备的类似包按钮、文本字段等,在 Jupiter 或 Colab 中运行后完成一个单元格。colab 会保存您上次运行单元的时间,如果您使用这些包训练模型,那么它会认为您处于空闲状态,因此 30 分钟后它会让您断开连接。

像这样

于 2022-01-11T20:01:32.073 回答