如何防止 Google Colab 断开连接?

Posted

技术标签:

【中文标题】如何防止 Google Colab 断开连接?【英文标题】:How to prevent Google Colab from disconnecting? 【发布时间】:2019-11-28 11:51:00 【问题描述】:

问:有没有办法以编程方式防止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 或 Chromium 浏览器

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


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

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

有更好的方法吗?

【问题讨论】:

我也想知道同样的问题。在论文答辩期间对学生有帮助。 "90 分钟的空闲超时...如果用户超过 90 分钟未与他的 google Colab 笔记本交互,其实例将自动终止。"这很糟糕,因为那时无法使用 kerastuner。如果 Google 员工真的希望公众使用 kerastuner,他们需要更加努力地思考。 如何阻止这个脚本执行? 不是代码,而是系统上的一个小重量和退格键可以为您解决问题。希望你能理解! 不幸的是,到 2021 年 3 月,这些方法都不再起作用了,事实上,在大约 2-3 小时的会话打开后,会弹出一个带有“不是机器人”按钮的窗口,这个窗口打开不管你在做什么(它甚至可以在你写作的时候弹出),如果你没有点击按钮会话在几分钟内结束 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

它说 Uncaught TypeError: Cannot read property 'click' of null at ConnectButton 看来你的回答已经过时了 通过更新 JS 选择器修复它 在 Chrome 中,您可以创建一个书签以一键激活此 sn-p。只需使用以下 URL 创建一个书签:javascript:void(setInterval(function() console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); ,60000))(同一命令的单行版本)。我不确定这是否适用于其他浏览器 @qAp 我发现即使你在不同的标签上,它仍然可以工作,或者你的屏幕由于屏幕保护程序而关闭(我已经训练模型超过 10 个小时)【参考方案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()

【讨论】:

【参考方案4】:

我认为 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,并出现下拉菜单。单击下拉菜单会创建一个新的&lt;DIV class=goog menu...&gt;,之前未在 DOM 中显示,其中有 2 个选项“连接到托管运行时”和“连接到本地运行时”。如果控制台窗口已打开并显示元素,您可以在单击下拉元素时看到此 DIV。只需在出现的新窗口中的两个选项之间移动鼠标焦点,即可向 DOM 中添加其他元素,一旦鼠标失去焦点,它们就会从 DOM 中完全移除,即使不单击也是如此。

【讨论】:

同意,有什么解决办法【参考方案5】:

这对我有用 -

在控制台中运行以下代码,它将阻止您断开连接。 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

【讨论】:

感谢这对我也很有效。 (我上周在这里留下了同样的评论,但它消失了。重要的是不要失去工作,所以这个答案值得积极的反馈。) 不工作,仍然断开连接。 (使用 Firefox 浏览器 74.0(64 位))。 即使您将浏览器窗口最小化并与其他应用程序一起使用,这是否也有效?【参考方案6】:

用 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 秒扩展和收缩一次 所以你的会话不会过期 重要 - 您必须在您的电脑上运行此代码

【讨论】:

我试过这个,当我导入 pynput 时出现 DisplayNameError。这可能是因为我们只能通过浏览器(在托管的运行时会话中)访问 colab,而不是键盘/鼠标等。 我想,你误解了这个想法。 Colab 不能通过 python 访问。只有你的鼠标由上面的代码控制(因为模拟,鼠标与浏览器交互)。修复本地电脑中的库问题 这个解决方案对我有用,只是一个修改而不是点击文件目录我点击 colab 页面上的评论图标,它只是打开评论框,然后每 30 秒后关闭。 【参考方案7】:

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

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

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

【讨论】:

我会在你的回答中补充一点,Firefox 可以很好地使用这个技巧。但对我来说,我关闭了我的 Mac 上的睡眠模式,并将浏览器窗口放在所有其他窗口的前面,就好像我在积极地处理它一样。我把它留了一整夜,它的工作原理。所有的 javascript 技巧都没有奏效。一个注意事项是我使用的是 Google Colab Pro:所以我不确定这是否适用于免费的 colab。 @Yasser Sinjab 感谢您的补充,我使用免费版本,效果很好。【参考方案8】:

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

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

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

希望对你有帮助。

【讨论】:

【参考方案9】:

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

function ClickConnect()
    console.log("Working"); 
    document.querySelector("colab-connect-button").click() 

setInterval(ClickConnect,60000)

【讨论】:

【参考方案10】:

由于现在连接按钮的id变成了“colab-connect-button”,下面的代码可以用来一直点击按钮。

function ClickConnect()
    console.log("Clicked on connect button"); 
    document.querySelector("colab-connect-button").click()

setInterval(ClickConnect,60000)

如果还是不行,那就按以下步骤操作吧:

    右键单击连接按钮(在 colab 的右上角) 点击检查 获取按钮的 HTML id 并替换为以下代码
function ClickConnect()
    console.log("Clicked on connect button"); 
    document.querySelector("Put ID here").click() // Change id here

setInterval(ClickConnect,60000)

【讨论】:

这是根据新按钮 ID(2020 年 2 月)的当前解决方案 如果谷歌试图让它不起作用(例如:将其设为一个类并在同一个类中有多个假的不可见按钮),您总是可以代替第 3 步:右键单击 -- > 复制 --> 复制 JS 路径 仍然遇到同样的问题运行时断开,运行时由于不活动而断开 如何阻止这个脚本执行? @MurtazaKamal Crtl + Shift + I ,转到源并单击暂停按钮。【参考方案11】:

试试这个:

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


setInterval(ClickConnect,60000)

【讨论】:

【参考方案12】:

以下例子对我来说:

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

【讨论】:

对我来说,这是唯一不会引发错误的解决方案。谢谢 以上方法我都试过了,其他几篇博客都试过了。到目前为止,并且与今天相关,您的两个代码都可以正常工作。谢谢你:)【参考方案13】:

我会推荐使用 JQuery(Co-lab 似乎默认包含 JQuery)。

function ClickConnect()
  console.log("Working");
  $("colab-toolbar-button").click();

setInterval(ClickConnect,60000);

【讨论】:

这个不行:Uncaught ReferenceError: $ is not defined at ClickConnect (&lt;anonymous&gt;:3:3)【参考方案14】:

您也可以使用 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])

【讨论】:

顺便说一句,您可能想访问array 的内容,这段代码似乎完全决定每次按L、R、U、D 为什么不for key in array: press(key)【参考方案15】:
function ClickConnect()
    console.log("Clicked on connect button"); 
    document.querySelector("connect").click() // Change id here

setInterval(ClickConnect,60000)

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

【讨论】:

【参考方案16】:

我对这些 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)

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

【讨论】:

【参考方案17】:

我一直在寻找解决方案,直到我找到了一个 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 &lt;package_name&gt; 您只需使用 sudo (在您的本地计算机上)运行它(因为它会控制鼠标),它应该可以工作,让您充分利用 Colab 的 12 小时会话。

致谢: For those using Colab (Pro): Preventing Session from disconnecting due to inactivity

【讨论】:

我怀疑你也想把它放在一个单独的线程中:D @FalconUA,昨晚我让 Colab 在我的 PC 上运行,当我早上醒来时,我发现它仍在运行。我猜脚本运行良好,但我收到了一些关于线程的警告,你是对的。【参考方案18】:
function ClickConnect()

    console.log("Working...."); 
    document.querySelector("paper-button#comments").click()

setInterval(ClickConnect,600)

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

学习愉快:)

【讨论】:

【参考方案19】:

以下最新解决方案适用于我:

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)

【讨论】:

考虑为您的答案提供解释。【参考方案20】:

下面的 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 按钮。

【讨论】:

【参考方案21】:

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

!python

也要退出这个模式,写

exit()

【讨论】:

【参考方案22】:

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

import getpass
authtoken = getpass.getpass()

【讨论】:

【参考方案23】:

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

function ClickConnect()
console.log("Working"); 
document.querySelector("paper-icon-button").click()

Const myjob = setInterval(ClickConnect, 60000)

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

clearInterval(myjob)

【讨论】:

【参考方案24】:

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

function ClickConnect()

console.log("Working"); 
document.querySelector("#comments > span").click() 

setInterval(ClickConnect,5000)

【讨论】:

【参考方案25】:

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

function ClickRefresh()
    console.log("Clicked on refresh button"); 
    document.querySelector("paper-icon-button").click()

setInterval(ClickRefresh, 60000)

请随时在此 gist https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e 上为此贡献更多的 sn-ps

【讨论】:

【参考方案26】:

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

function ClickRefresh()
  console.log("Working"); 
  document.querySelector("[icon='colab:folder-refresh']").click()

const myjob = setInterval(ClickRefresh, 60000)

【讨论】:

请注意,文件资源管理器/文件夹窗格必须展开才能使用。【参考方案27】:

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

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

这是video demonstration。

【讨论】:

【参考方案28】:

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

【讨论】:

【参考方案29】:

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

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

【讨论】:

最佳答案在这里。【参考方案30】:
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());
;

【讨论】:

以上是关于如何防止 Google Colab 断开连接?的主要内容,如果未能解决你的问题,请参考以下文章

Google驱动器与COLAB断开连接

如果我断开连接,Google Colab 会继续运行单元以将文件保存在已安装的驱动器中吗?

如何重新连接到 Google Colab 上正在进行的进程

Colab使用踩坑

Colab Pro 在使用 TPU 运行时训练深度学习模型 12 小时后自动断开连接

google.colab 模块中是不是有关闭运行时的功能