如何防止 Google Colab 断开连接?

2024-10-22 08:29:00
admin
原创
98
摘要:问题描述:有没有办法以编程方式防止Google Colab因超时断开连接?以下描述了导致笔记本电脑自动断开连接的情况:Google Colab 笔记本的空闲超时为 90 分钟,绝对超时为 12 小时。这意味着,如果用户超过 90 分钟未与其 Google Colab 笔记本交互,其实例将自动终止。此外,Col...

问题描述:

有没有办法以编程方式防止Google Colab因超时断开连接?

IT科技

以下描述了导致笔记本电脑自动断开连接的情况:

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 的使用条款,尽管他们的常见问题解答不鼓励这种行为(简而言之:如果你不是真的需要,从道德上讲,用完所有的 GPU 是不对的)。


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

  • 首先,我关闭屏幕保护程序,这样我的屏幕就一直亮着。

  • 我有一块Arduino开发板,所以我把它变成了一个橡皮鸭 USB设备,并让它在我睡觉时模拟原始的用户交互(只是因为我手头有它用于其他用例)。

还有更好的方法吗?


解决方案 1:

截至 2021 年 3 月,这些方法都不再起作用,因为 Google 添加了一段时间后随机弹出的CAPTCHA按钮。

在此之前,解决方案非常简单,不需要任何 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);

解决方案 2:

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

解决方案 3:

对我来说以下是例子:

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

解决方案 4:

嗯,这对我有用:

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

Ctrl++打开检查器视图。然后转到控制台ShiftI

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

如何防止 Colaboratory 断开连接

解决方案 5:

使用pynput在你的电脑上创建 Python 代码:

from pynput.mouse import Button, Controller
import time

mouse = Controller()

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

在您的桌面上运行此代码。然后将鼠标箭头指向(Colaboratory 的左侧面板 - 文件部分)任意目录的目录结构。

此代码将每 30 秒持续点击目录一次,因此目录将每 30 秒扩展和缩小一次。因此您的会话不会过期。

重要提示--您必须在您的电脑上运行此代码。

解决方案 6:

我没有单击Connect按钮,而是单击了按钮Comment以保持会话处于活动状态(2020 年 8 月):

function ClickConnect(){

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

解决方案 7:

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

解决方案 8:

先前的答案在一些脚本的帮助下可能会起到很好的作用。

对于这种不使用脚本的烦人断线问题,我有一个解决方案(或一种技巧),尤其是当你的程序必须从你的 Google Drive 读取数据时,比如训练深度学习网络模型,使用脚本执行操作reconnect是没有用的,因为一旦你与 Colaboratory 断开连接,程序就死机了。你应该手动再次连接到你的 Google Drive,让你的模型能够再次读取数据集,但脚本不会这样做。

我已经测试过很多次了并且效果很好。

当您使用浏览器(我使用 Chrome)在 Colaboratory 页面上运行程序时,请记住,一旦程序开始运行,就不要对浏览器进行任何操作,例如:切换到其他网页、打开或关闭另一个网页等等。只需将其留在那里,等待程序运行完毕。您可以切换到其他软件(例如PyCharm)继续编写代码,但不能切换到另一个网页。

我不知道为什么打开或关闭或切换到其他页面会导致 Colaboratory 页面的连接问题,但每次我尝试打扰我的浏览器,比如做一些搜索工作时,我与 Colaboratory 的连接很快就会中断。

解决方案 9:

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

解决方案 10:

尝试一下:

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

setInterval(ClickConnect,60000)

解决方案 11:

更新中(2021 年 7 月)。

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

解决方案 12:

我不相信 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))

第一次执行 Run all 时(在 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 中显示的新菜单,其中包含 2 个选项“连接到托管运行时”和“连接到本地运行时”。如果控制台窗口已打开并显示元素,则单击下拉元素时可以看到此 DIV 出现。只需在出现的新窗口中将鼠标焦点移动到两个选项之间,即可将其他元素添加到 DOM,一旦鼠标失去焦点,它们就会从 DOM 中完全删除,即使没有单击。

解决方案 13:

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

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

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

解决方案 14:

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

解决方案 15:

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)

解决方案 16:

截至目前June 2023,这是用于防止 Google colab 因不活动而断开连接的有效 javascript 代码。

 function keepAliveProgrammatically() {
  document.querySelector('colab-connect-button').shadowRoot.querySelector("#connect").click();
} 

上面的函数负责单击compute resources按钮。该按钮每 6 秒被单击一次。下面的代码片段负责运行该函数。

const keepAliveProgrammaticallyInterval = setInterval(() => {
    keepAliveProgrammatically();
}, 6000);

要停止代码,请使用下面的代码片段。

clearInterval(keepAliveProgrammaticallyInterval);

解决方案 17:

我尝试了之前答案中的代码,但它们对我来说不起作用。所以这是我用于重新连接的 JavaScript 代码。

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

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

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

解决方案 18:

这对我有用:

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

运行代码片段Hide results展开片段

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

clearInterval(myjob)

运行代码片段Hide results展开片段

解决方案 19:

这个对我有用(好像他们改变了按钮的类名或id):

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

运行代码片段Hide results展开片段

解决方案 20:

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

!python

要退出此模式,请写入

exit()

解决方案 21:

投票最多的答案对我来说确实有效,但它会让“管理会话”窗口一次又一次地弹出。

我已经通过使用下面的浏览器控制台自动单击刷新按钮解决了这个问题

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

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

解决方案 22:

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

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

解决方案 23:

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

确实,它包含一种不让机器因空转而死亡的机制。

这里有一个视频演示。

解决方案 24:

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

活动会话

自动弹出。我们需要 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);

Run code snippetHide resultsExpand snippet

  1. 单击“活动”,然后重新加载 > 完成

感谢 Oshayr、Albert Einstein以及所有在此发布解决方案的人。

解决方案 25:

下面的 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++ShiftI。将脚本复制并粘贴到提示行中。然后Enter在关闭编辑器之前按下 。

通过这样做,该功能将每 60 秒检查一次,查看屏幕上的连接对话框是否显示,如果显示,则该功能将OK自动为您单击按钮。

解决方案 26:

2023 年 7 月版本:

function ConnectButton() {
    console.log("trying to click connect button");

    let colabConnectButton = document.querySelector("colab-connect-button");
    if (colabConnectButton && colabConnectButton.shadowRoot) {
        let actualButton = colabConnectButton.shadowRoot.querySelector("colab-toolbar-button#connect");
        if (actualButton) {
            actualButton.click();
            console.log("connect button clicked");
        } else {
            console.log("button not found");
        }
    } else {
        console.log("button not found");
    }
}
setInterval(ConnectButton, 60000);

解决方案 27:

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

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

解决方案 28:

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

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

解决方案 29:

我对以下 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)

您肯定会知道它是否真的有效。

解决方案 30:

以下最新的解决方案对我有用:

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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用