F: Gibt es eine Möglichkeit, programmgesteuert zu verhindern, dass Google Colab bei einer Zeitüberschreitung die Verbindung trennt?
Im Folgenden werden die Bedingungen beschrieben, unter denen ein Notebook automatisch getrennt wird:
Google Colab-Notebooks haben eine Leerlaufzeit von 90 Minuten und eine absolute Zeitüberschreitung von 12 Stunden. Wenn der Nutzer länger als 90 Minuten nicht mit seinem Google Colab-Notizbuch interagiert, wird seine Instanz automatisch beendet. Die maximale Lebensdauer einer Colab-Instanz beträgt 12 Stunden.
Natürlich möchten wir das Maximum automatisch aus der Instanz herausholen, ohne ständig manuell damit interagieren zu müssen . Hier gehe ich von allgemein bekannten Systemanforderungen aus:
- Ubuntu 18 LTS / Windows 10 / Mac Betriebssysteme
- Bei Linux-basierten Systemen werden gängige DEs wie Gnome 3 oder Unity verwendet
- Firefox- oder Chromium-Browser
Ich möchte hier darauf hinweisen, dass ein solches Verhalten nicht gegen die Nutzungsbedingungen von Google Colab verstößt , obwohl es nicht gemäß den häufig gestellten Fragen empfohlen wird (kurz: Moralisch gesehen ist es nicht in Ordnung, alle GPUs zu verbrauchen, wenn Sie es nicht wirklich benötigen ).
Meine aktuelle Lösung ist sehr dumm:
- Zuerst schalte ich den Bildschirmschoner aus, damit mein Bildschirm immer eingeschaltet ist.
- Ich habe ein Arduino-Board, also habe ich es einfach in einen Gummi-Enten-USB verwandelt und es dazu gebracht, primitive Benutzerinteraktionen zu emulieren, während ich schlafe (nur weil ich es für andere Anwendungsfälle zur Hand habe).
Gibt es bessere Möglichkeiten?
Antworten:
Bearbeiten: Anscheinend ist die Lösung sehr einfach und benötigt kein JavaScript. Erstellen Sie einfach unten eine neue Zelle mit der folgenden Zeile:
while True:pass
Halten Sie nun die Zelle in der Ausführungssequenz, damit die Endlosschleife nicht stoppt und Ihre Sitzung am Leben bleibt.
Alte Methode: Legen Sie ein Javascript-Intervall fest, um alle 60 Sekunden auf die Schaltfläche "Verbinden" zu klicken. Öffnen Sie die Entwicklereinstellungen (in Ihrem Webbrowser) mit Strg + Umschalt + I, klicken Sie dann auf die Registerkarte Konsole und geben Sie diese an der Konsolenaufforderung ein. (Für Mac drücken Sie Option + Befehl + I)
function ConnectButton(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click() } setInterval(ConnectButton,60000);
quelle
javascript:void(setInterval(function(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); },60000))
(einzeilige Version desselben Befehls). Ich bin nicht sicher, ob dies in anderen BrowsernDa die ID der Schaltfläche "Verbinden" jetzt in "Colab-Connect-Schaltfläche" geändert wird, kann der folgende Code verwendet werden, um weiterhin auf die Schaltfläche zu klicken.
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("Put ID here").click() // Change id here } setInterval(ClickConnect,60000)
quelle
Nun, das funktioniert für mich -
Führen Sie den folgenden Code in der Konsole aus, um zu verhindern, dass Sie die Verbindung trennen. Strg + Umschalt + i, um die Inspektoransicht zu öffnen. Dann gehe zur Konsole.
function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button#connect").click() } setInterval(ClickConnect,60000)
So verhindern Sie, dass Google Colab die Verbindung trennt
quelle
Für mich folgende Beispiele:
document.querySelector("#connect").click()
oderdocument.querySelector("colab-toolbar-button#connect").click()
oderdocument.querySelector("colab-connect-button").click()
warfen Fehler.
Ich musste sie an Folgendes anpassen:
Version 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)
Version 2: Wenn Sie die Funktion beenden möchten, finden Sie hier den neuen Code:
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();
Um zu stoppen, rufen Sie an:
quelle
Erstellen Sie mit pynput einen Python-Code in Ihrem PC
from pynput.mouse import Button, Controller import time mouse = Controller() while True: mouse.click(Button.left, 1) time.sleep(30)
Führen Sie diesen Code auf Ihrem Desktop aus. Zeigen Sie dann mit dem Mauspfeil über die Verzeichnisstruktur (Spalte links - Dateibereich) in einem beliebigen Verzeichnis. Dieser Code klickt alle 30 Sekunden auf das Verzeichnis, sodass er alle 30 Sekunden erweitert und verkleinert wird, sodass Ihre Sitzung dies nicht tut abgelaufen Wichtig - Sie müssen diesen Code auf Ihrem PC ausführen
quelle
Anstatt auf die Schaltfläche "Verbinden" zu klicken, klicke ich einfach auf die Schaltfläche "Kommentar", um meine Sitzung am Leben zu erhalten. (August 2020)
function ClickConnect(){ console.log("Working"); document.querySelector("#comments > span").click() } setInterval(ClickConnect,5000)
quelle
Ich verwende ein Makroprogramm, um regelmäßig auf die Schaltfläche RAM / Disk zu klicken, um das Modell die ganze Nacht zu trainieren. Der Trick besteht darin, ein Makroprogramm so zu konfigurieren, dass es zweimal mit einem kurzen Intervall zwischen den beiden Klicks auf die Ram / Disk Colab-Symbolleistenschaltfläche klickt, sodass die Verbindung auch dann wiederhergestellt wird, wenn die Laufzeit getrennt wird. (Der erste Klick dient zum Schließen des Dialogfelds und der zweite Klick zum erneuten Verbinden). Sie müssen Ihren Laptop jedoch die ganze Nacht offen lassen und möglicherweise die Registerkarte Colab anheften.
quelle
Die obigen Antworten mit Hilfe einiger Skripte funktionieren möglicherweise gut. Ich habe eine Lösung (oder eine Art Trick) für die lästige Trennung ohne Skripte, vor allem , wenn Ihr Programm Daten von Google Drive lesen muß, wie tief ein Lernnetzwerk - Modell trainiert, wo Skripte zu tun
reconnect
Betrieb ist zwecklos , weil einmal Wenn Sie die Verbindung zu Ihrem Colab trennen, ist das Programm gerade tot. Sie sollten erneut eine manuelle Verbindung zu Ihrem Google-Laufwerk herstellen, damit Ihr Modell den Datensatz wieder lesen kann. Die Skripte tun dies jedoch nicht.Ich habe es schon oft getestet und es funktioniert gut.
Wenn Sie ein Programm auf der Colab-Seite mit einem Browser ausführen (ich verwende Chrome), denken Sie daran, dass Sie nach dem Start Ihres Programms keine Vorgänge mit Ihrem Browser ausführen, z. B.: Wechseln zu anderen Webseiten, Öffnen oder Schließen einer anderen Webseite und Lassen Sie es einfach dort und warten Sie, bis Ihr Programm beendet ist. Sie können zu einer anderen Software wie pycharm wechseln, um Ihre Codes weiter zu schreiben, aber nicht zu einer anderen Webseite zu wechseln. Ich weiß nicht, warum das Öffnen oder Schließen oder Wechseln zu anderen Seiten das Verbindungsproblem der Google Colab-Seite verursacht, aber jedes Mal, wenn ich versuche, meinen Browser zu stören, wie bei einem Suchjob, wird meine Verbindung zu Colab bald unterbrochen.
quelle
Versuche dies:
function ClickConnect(){ console.log("Working"); document .querySelector("#top-toolbar > colab-connect-button") .shadowRoot .querySelector("#connect") .click() } setInterval(ClickConnect,60000)
quelle
Verwendung von Python-Selen
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()
quelle
Ich glaube nicht, dass die JavaScript-Lösungen mehr funktionieren. Ich habe es aus meinem Notizbuch heraus gemacht mit:
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))
Wenn Sie zum ersten Mal alle ausführen (bevor der JavaScript- oder Python-Code gestartet wurde), zeigt die Konsole Folgendes an:
Connected to wss://colab.research.google.com/api/kernels/0e1ce105-0127-4758-90e48cf801ce01a3/channels?session_id=5d8...
Immer wenn JavaScript ausgeführt wird, wird der Abschnitt console.log angezeigt, der Klickabschnitt enthält jedoch lediglich Folgendes:
Connect pushed Uncaught TypeError: Cannot read property 'click' of null at ConnectButton (<anonymous>:1:92)
Andere schlugen vor, dass der Name der Schaltfläche in # colab-connect-button geändert wurde, dies führt jedoch zu demselben Fehler.
Nach dem Start der Laufzeit wird die Schaltfläche geändert, um RAM / DISK anzuzeigen, und ein Dropdown-Menü wird angezeigt. Durch Klicken auf die Dropdown-Liste wird eine neue Datei erstellt
<DIV class=goog menu...>
, die zuvor im DOM nicht angezeigt wurde. Sie bietet zwei Optionen: "Mit gehosteter Laufzeit verbinden" und "Mit lokaler Laufzeit verbinden". Wenn das Konsolenfenster geöffnet ist und Elemente anzeigt, wird dieser DIV angezeigt, wenn Sie auf das Dropdown-Element klicken. Durch einfaches Verschieben des Mausfokus zwischen den beiden Optionen im neuen Fenster werden zusätzliche Elemente zum DOM hinzugefügt. Sobald die Maus den Fokus verliert, werden sie auch ohne Klicken vollständig aus dem DOM entfernt.quelle
Ich habe die obigen Codes ausprobiert, aber sie haben bei mir nicht funktioniert. Hier ist mein JS-Code zum erneuten Verbinden.
let interval = setInterval(function(){ let ok = document.getElementById('ok'); if(ok != null){ console.log("Connect pushed"); ok.click(); }},60000)
Sie können es auf die gleiche Weise verwenden (auf der Konsole Ihres Browsers ausführen), um es auszuführen. Wenn Sie das Skript stoppen möchten, können Sie es eingeben
clearInterval(interval)
und erneut ausführensetInterval(interval)
.Ich hoffe das hilft dir.
quelle
Update beendet. Für mich geht das.
function ClickConnect(){ console.log("Working"); document.querySelector("paper-icon-button").click() } Const myjob = setInterval(ClickConnect, 60000)
Wenn Sie nicht für Sie arbeiten, versuchen Sie es zu klären, indem Sie laufen:
clearInterval(myjob)
quelle
Dieser hat für mich funktioniert (anscheinend haben sie den Klassennamen oder die ID der Schaltfläche geändert):
function ClickConnect(){ console.log("Working"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
quelle
Ich würde die Verwendung von JQuery empfehlen (es scheint, dass Co-Lab standardmäßig JQuery enthält).
function ClickConnect(){ console.log("Working"); $("colab-toolbar-button").click(); } setInterval(ClickConnect,60000);
quelle
Uncaught ReferenceError: $ is not defined at ClickConnect (<anonymous>:3:3)
Ich habe ein Problem mit diesen Javascript-Funktionen:
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
Sie drucken die Schaltfläche "Auf Verbindung klicken" auf der Konsole, bevor die Schaltfläche tatsächlich angeklickt wird. Wie Sie den verschiedenen Antworten in diesem Thread entnehmen können, hat sich die ID der Schaltfläche "Verbinden" seit dem Start von Google Colab einige Male geändert. Und es könnte auch in Zukunft geändert werden. Wenn Sie also eine alte Antwort aus diesem Thread kopieren möchten, wird möglicherweise "Klicken auf die Schaltfläche" Verbinden "angezeigt, dies ist jedoch möglicherweise nicht der Fall. Wenn das Klicken nicht funktioniert, wird natürlich ein Fehler auf der Konsole ausgegeben, aber was ist, wenn Sie ihn möglicherweise nicht versehentlich sehen? Also mach das besser:
function ClickConnect(){ document.querySelector("colab-connect-button").click() console.log("Clicked on connect button"); } setInterval(ClickConnect,60000)
Und Sie werden auf jeden Fall sehen, ob es wirklich funktioniert oder nicht.
quelle
function ClickConnect() { console.log("Working...."); document.querySelector("paper-button#comments").click() } setInterval(ClickConnect,600)
Das hat bei mir funktioniert, aber mit Bedacht eingesetzt
viel Spaß beim Lernen :)
quelle
Die folgende NEUESTE Lösung funktioniert für mich:
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)
quelle
Das Javascript unten funktioniert für mich. Credits an @ 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);
Klicken Sie im Colab-Notizbuch
i
gleichzeitig auf Strg + Umschalt + Taste. Kopieren Sie das Skript und fügen Sie es in die Eingabeaufforderungszeile ein. Drücken Sie dann,Enter
bevor Sie den Editor schließen.Auf diese Weise überprüft die Funktion alle 60 Sekunden, ob der Verbindungsdialog auf dem Bildschirm angezeigt wird. Wenn dies der Fall ist, klickt die Funktion
ok
automatisch auf die Schaltfläche für Sie.quelle
Nun, ich bin kein Python-Typ und ich weiß auch nicht, was die eigentliche Verwendung dieses 'Colab' ist. Ich benutze es als Build-System. Lol. Und ich habe die SSH-Weiterleitung darin eingerichtet, dann diesen Code eingefügt und ihn einfach laufen lassen und ja, es funktioniert.
import getpass authtoken = getpass.getpass()
quelle
Die am häufigsten gewählte Antwort funktioniert sicherlich für mich, aber das Fenster "Sitzung verwalten" wird immer wieder angezeigt.
Ich habe das gelöst, indem ich über die unten stehende Browserkonsole automatisch auf die Schaltfläche Aktualisieren geklickt habe
function ClickRefresh(){ console.log("Clicked on refresh button"); document.querySelector("paper-icon-button").click() } setInterval(ClickRefresh, 60000)
Weitere Informationen hierzu finden Sie unter https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e
quelle
Dieser Code klickt im Datei-Explorer-Bereich weiterhin auf "Ordner aktualisieren".
function ClickRefresh(){ console.log("Working"); document.querySelector("[icon='colab:folder-refresh']").click() } const myjob = setInterval(ClickRefresh, 60000)
quelle
Sie können auch Python verwenden, um die Pfeiltasten zu drücken. Ich habe auch im folgenden Code ein wenig Zufälligkeit hinzugefügt.
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])
quelle
array
, dieser Code scheint ganz entschlossen zu sein, jedes Mal L, R, U, D zu drückenfor key in array: press(key)
Führen Sie einfach den folgenden Code nach der Zelle aus, die Sie ausführen möchten, um Datenverlust zu vermeiden.
Schreiben Sie auch, um diesen Modus zu verlassen
quelle
Ich suchte nach einer Lösung, bis ich einen Python3 fand, der die Maus zufällig hin und her bewegt und klickt, immer an derselben Stelle, aber das reicht aus, um Colab zu täuschen, ich sei auf dem Notebook aktiv und trenne nicht.
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()
Sie müssen die erforderlichen Pakete installieren:
sudo -H pip3 install <package_name>
Sie müssen es nur (auf Ihrem lokalen Computer) mit ausführensudo
(da es die Kontrolle über die Maus übernimmt) und es sollte funktionieren, sodass Sie die 12-Stunden-Sitzungen von Colab voll ausnutzen können.Credits: Für Benutzer von Colab (Pro): Verhindert, dass die Sitzung aufgrund von Inaktivität getrennt wird
quelle
Mit GNU Colab können Sie eine standardmäßige persistente Desktop-Umgebung auf einer Colaboratory-Instanz ausführen.
In der Tat enthält es einen Mechanismus, der Maschinen nicht im Leerlauf sterben lässt.
Hier ist eine Videodemonstration .
quelle
Möglicherweise funktionieren viele der vorherigen Lösungen nicht mehr. Dieser folgende Code erstellt beispielsweise weiterhin neue Codezellen in Colab, funktioniert jedoch. Zweifellos ist das Erstellen einer Reihe von Codezellen eine Unannehmlichkeit. Wenn in einigen Betriebsstunden zu viele Codezellen erstellt werden und nicht genügend RAM vorhanden ist, friert der Browser möglicherweise ein.
Dadurch werden wiederholt Codezellen erstellt.
function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button").click() }setInterval(ClickConnect,60000)
Aber ich habe festgestellt, dass der folgende Code funktioniert und keine Probleme verursacht. Klicken Sie auf der Registerkarte Colab-Notizbuch
Ctrl + Shift + i
gleichzeitig auf die Taste und fügen Sie den folgenden Code in die Konsole ein. 120000 Intervalle sind genug.function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button#connect").click() }setInterval(ClickConnect,120000)
Ich habe diesen Code im November 2020 in Firefox getestet. Er funktioniert auch auf Chrom.
quelle
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("connect").click() // Change id here } setInterval(ClickConnect,60000)
Versuchen Sie den obigen Code, es hat bei mir funktioniert :)
quelle