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

9

试试这个:

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

setInterval(ClickConnect,60000)

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部分的输出,但是单击部分只显示:
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中显示过,其中包含两个选项“连接到托管运行时”和“连接到本地运行时”。 如果控制台窗口打开并显示元素,则可以在单击下拉元素时看到此DIV出现。 在新窗口中的两个选项之间移动鼠标焦点会向DOM添加其他元素,一旦鼠标失去焦点,这些元素即被完全从DOM中删除,而无需单击。


7
您可以将笔记本加入书签以保持连接:
function ClickConnect(){
    console.log("Clicked on star button"); 
    document.querySelector("iron-icon#star-icon").click()
}
setInterval(ClickConnect, 60000) 

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


1
document.querySelector("iron-icon#star-icon") 现在为 null。所以我找到了一个 colab 步骤中展开按钮的 jspath,并用该展开元素替换了星形图标元素。1. 在元素面板中,右键单击该展开图标元素。2. 复制->复制 jspath。对于我来说,它是 document.querySelector("#cell-bbKbx185zqlz > div.main-content > div.editor-container.horizontal > div.text-top-div > div > span > h1 > paper-icon-button").shadowRoot.querySelector("#icon")。这可以在一定时间内使用,但其他评论说,随着时间的推移,验证码将出现。 - Dashiell Rose Bark-Huss

7

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

可能不再有效. - Peter Mortensen

6

这个YouTube视频中的解决方案 "如何防止Google 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)

6
这对我有效:

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

如果不起作用,请尝试通过运行以下命令清除它:

clearInterval(myjob)


6

我尝试了之前回答中的代码,但对我不起作用。因此,这里是我的JavaScript代码以重新连接。

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

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

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


5

以下方案适用于我(似乎他们更改了按钮的类名或 ID):

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


4

我找到了一个巧妙的解决方案,可以自动消除弹出的

活动会话

窗口。我们需要两个函数来实现这个功能,

和之前一样的步骤。检查>控制台>逐一粘贴函数

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

编辑:

如果您不喜欢手动完成所有这些操作,有一种方法可以自动化所有这些操作!

方法一:使用此 Chrome 扩展程序 即可完成。

或者

方法二:

  1. 使用 Page-Manipulator 扩展程序
  2. 单击它,然后单击添加 JavaScript 按钮 > + 新建 + > 文件名
  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、阿尔伯特·爱因斯坦和所有在此发布其解决方案的人。


4

GNU Colab 可以让你在 Colaboratory 实例上运行标准的持久桌面环境。

它拥有一种机制,可以防止机器因闲置而死亡。

这里有一个演示视频


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