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

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

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

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

Ubuntu 18.04 LTS (Bionic Beaver), Windows 10或Mac操作系统 对于基于linux的系统,使用流行的桌面环境,如GNOME 3或Unity Firefox或Chromium浏览器

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


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

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

有没有更好的办法?


当前回答

这对我来说很管用:

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

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

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

如何防止协作中心断开连接

其他回答

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

活动会话

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

与前面的步骤相同。逐个检查>控制台>粘贴功能

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扩展和完成

or

Way_2。

使用page -机械手扩展 点击它,然后点击添加Java脚本按钮> +新建+ >文件名 文件名是ColabAlive > Make 活跃网站= colab.research.google.com 匹配页面=递归 然后使用下面的代码,

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

单击“活动”,然后重新加载> done

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

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

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

禁止使用Ipywidgets。

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

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

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

document.querySelector(“#连接”).click()或 document.querySelector(“colab-toolbar-button #连接”).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年8月):

function ClickConnect(){

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