如何防止Google Colab断开连接?

时间:2019-07-19 13:10:41

标签: python linux jupyter-notebook google-colaboratory

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

以下内容描述了导致笔记本计算机自动断开连接的情况:

  

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

自然,我们想自动从实例without having to manually interact with it constantly中挤出最大值。在这里,我假设常见的系统要求:

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

我应该在这里指出,这种行为不会违反 Google Colab's Terms of Use,尽管根据他们的FAQ并没有鼓励(简而言之:道德上如果您不需要的话,请用尽所有GPU。)

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

  • 首先,我关闭屏幕保护程序,因此屏幕始终保持打开状态。
  • 我有一个Arduino开发板,所以我只是将它变成了rubber ducky usb,并使其在我睡觉时模拟原始用户交互(只是因为我手头有其他用例)。

还有更好的方法吗?

33 个答案:

答案 0 :(得分:48)

由于连接按钮的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)

答案 1 :(得分:18)

对我来说,以下示例:

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

答案 2 :(得分:12)

设置一个JavaScript间隔,以每60秒单击一次connect按钮。 使用Ctrl + Shift + I打开开发人员设置(在您的Web浏览器中),然后单击控制台选项卡,然后在控制台提示符下键入此设置。 (对于Mac,请按Option + Command + I)

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

答案 3 :(得分:12)

我没有单击“连接”按钮,而是单击“评论”按钮以使会话保持活动状态。 (2020年8月)

function ClickConnect(){

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

答案 4 :(得分:8)

尝试一下:

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

setInterval(ClickConnect,60000)

答案 5 :(得分:5)

已更新一个。它对我有用。

org.springframework.boot.actuate.system.DiskSpaceHealthIndicator

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

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

答案 6 :(得分:4)

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

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

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

希望对您有帮助。

答案 7 :(得分:4)

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

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

答案 8 :(得分: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 Extension 并完成

Way_2。

  1. 使用 Page-Manipulator 扩展名
  2. 点击它,然后点击添加 Java Script 按钮 > + 新建 + > 文件名
  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. 点击活动,然后重新加载 > 完成

Credit goes to Oshayr, Albert Einstein 以及在此发布解决方案的所有人。

答案 9 :(得分:3)

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

实际上,它包含一种不让机器死于空转的机制。

这里是video demonstration

答案 10 :(得分:3)

好吧,我不是python家伙,也不知道这个'Colab'的实际用途是什么,我将其用作构建系统大声笑。而且我曾经在其中设置ssh转发,然后将这段代码放到运行中,是的。

{{1}}

答案 11 :(得分: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按钮。

答案 12 :(得分: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)

答案 13 :(得分:3)

function ClickConnect()
{
    console.log("Working...."); 
    document.querySelector("paper-button#comments").click()
}
setInterval(ClickConnect,600)

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

学习愉快:)

答案 14 :(得分:3)

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

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

随时根据https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e的要点为此贡献更多的片段

答案 15 :(得分:3)

我对这些javascript函数有疑问:

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

在实际单击按钮之前,他们会在控制台上打印“ Clicked on connect button”。从该线程中的不同答案可以看出,自Google Colab启动以来,connect按钮的ID已经更改了两次。而且将来也可能会更改。因此,如果您打算从该线程中复制旧答案,则可能会说“单击了连接按钮”,但实际上可能不会这样做。当然,如果单击不起作用,它将在控制台上显示一个错误,但是如果您可能不会意外看到该怎么办? 因此,您最好这样做:

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

您肯定会看到它是否真正起作用。

答案 16 :(得分:3)

此代码始终在文件资源管理器窗格中单击“刷新文件夹”。

function ClickRefresh(){
  console.log("Working"); 
  document.querySelector("[icon='colab:folder-refresh']").click()
}
const myjob = setInterval(ClickRefresh, 60000)

答案 17 :(得分:3)

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

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

答案 18 :(得分:3)

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

答案 19 :(得分:3)

也许以前的许多解决方案都不再起作用。例如,下面的代码继续在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上运行。

答案 20 :(得分: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

答案 21 :(得分:2)

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

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

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

答案 22 :(得分:2)

我一直在寻找解决方案,直到找到一个Python3,该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的12h会话。

积分: For those using Colab (Pro): Preventing Session from disconnecting due to inactivity

答案 23 :(得分:2)

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

!python

也要退出此模式,写

exit()

答案 24 :(得分:2)

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

答案 25 :(得分: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])

答案 26 :(得分:2)

这对我有用-

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

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

How to prevent google colab from disconnecting

答案 27 :(得分:1)

puppet agent -t --logdest=console

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

答案 28 :(得分:1)

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

答案 29 :(得分:1)

我认为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中完全删除。

答案 30 :(得分:1)

更新(7 月 21 日)。

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

答案 31 :(得分:0)

在某些脚本的帮助下,以上答案可能效果很好。对于没有脚本的烦人的断开连接,我有一个解决方案(或一种技巧),尤其是当您的程序必须从Google驱动器读取数据时,例如训练深度学习网络模型,其中使用脚本执行reconnect操作是没有用,因为一旦断开与colab的连接,程序就死了,应该再次手动连接到Google驱动器,以使模型能够再次读取数据集,但是脚本不会执行此操作。
我已经测试了很多次,并且效果很好。
当您使用浏览器(我使用Chrome)在colab页面上运行程序时,请记住,一旦程序开始运行,请勿对浏览器进行任何操作,例如:切换到其他网页,打开或关闭另一个网页网页等等,只需将其放置在那里并等待程序运行完毕,就可以切换到pycharm等其他软件来继续编写代码,但不能切换到另一个网页。我不知道为什么打开或关闭或切换到其他页面会导致google colab页面的连接问题,但是每次我尝试打扰我的浏览器(如执行某些搜索工作)时,我与colab的连接都会很快断开。

答案 32 :(得分:0)

在计算机中使用Pynput创建python代码

from pynput.mouse import Button, Controller
import time

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

在您的PC上运行此代码,然后将鼠标箭头指向任意目录上的目录结构(左侧的左侧栏-文件部分) 该代码将每30秒不断点击一次目录,因此它将 每30秒膨胀和收缩 这样您的会话不会过期 重要-您必须在PC中运行此代码