Q: Existe - t-il un moyen d'empêcher par programme Google Colab de se déconnecter en cas d'expiration du délai?
Ce qui suit décrit les conditions entraînant la déconnexion automatique d'un ordinateur portable:
Les ordinateurs portables Google Colab ont un délai d'inactivité de 90 minutes et un délai d'expiration absolu de 12 heures. Cela signifie que si l'utilisateur n'interagit pas avec son ordinateur portable Google Colab pendant plus de 90 minutes, son instance est automatiquement interrompue. En outre, la durée de vie maximale d'une instance Colab est de 12 heures.
Naturellement, nous voulons tirer automatiquement le maximum de l'instance, sans avoir à interagir manuellement avec elle en permanence . Ici, je suppose que les exigences système les plus courantes:
Je dois souligner ici qu'un tel comportement ne viole pas les conditions d'utilisation de Google Colab , bien qu'il ne soit pas encouragé selon leur FAQ (en bref: moralement, il n'est pas acceptable d'utiliser tous les GPU si vous n'en avez pas vraiment besoin. ).
Ma solution actuelle est très stupide:
Y a-t-il de meilleures façons?
28 Réponses :
J'utilise un programme de macro pour cliquer périodiquement sur le bouton RAM / disque pour entraîner le modèle toute la nuit. L'astuce consiste à configurer un programme macro pour qu'il clique deux fois sur le bouton de la barre d'outils Ram / Disk Colab avec un court intervalle entre les deux clics, de sorte que même si le Runtime est déconnecté, il se reconnecte. (le premier clic sert à fermer la boîte de dialogue et le deuxième clic à RECONNECTER). Cependant, vous devez toujours laisser votre ordinateur portable ouvert toute la nuit et peut-être épingler l'onglet Colab.
Edit: Apparemment, la solution est très simple et n'a pas besoin de JavaScript. Créez simplement une nouvelle cellule en bas avec la ligne suivante:
function ConnectButton(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click() } setInterval(ConnectButton,60000);
maintenant, gardez la cellule dans la séquence d'exécution afin que la boucle infinie ne s'arrête pas et maintienne ainsi votre session en vie.
Ancienne méthode: définissez un intervalle javascript pour cliquer sur le bouton de connexion toutes les 60 secondes. Ouvrez les paramètres du développeur (dans votre navigateur Web) avec Ctrl + Maj + I, puis cliquez sur l'onglet de la console et saisissez-le à l'invite de la console. (pour mac, appuyez sur Option + Commande + I)
while True:pass
Il indique Uncaught TypeError: Impossible de lire la propriété 'click' de null sur ConnectButton
Il semble que votre réponse soit obsolète
Correction du problème en mettant à jour le sélecteur JS
Dans Chrome, vous pouvez créer un favori pour activer cet extrait en un clic. Créez simplement un signet avec l'URL suivante: javascript:void(setInterval(function(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); },60000))
(version une ligne de la même commande). Je ne sais pas si cela fonctionne dans d'autres navigateurs
Cette réponse semble dépassée, n'a pas fonctionné pour moi!
L'économiseur d'écran doit-il être désactivé pour cela?
@qAp J'ai trouvé que cela fonctionnera toujours même si vous êtes sur un onglet différent ou que votre écran est éteint à cause d'un économiseur d'écran (j'entraîne des modèles depuis plus de 10 heures)
Le problème avec cette réponse est que le notebook peut se déconnecter et que le script le fait uniquement se reconnecter. Si vous utilisez Drive, vous devriez avoir besoin d'authentifier le compte Drive, puis le train s'arrête. Peut-être qu'un petit défilement de l'onglet de sortie devrait faire l'affaire
@TanayKarve J'ai ajouté ce commentaire à votre réponse car c'était la meilleure réponse au moment où j'écrivais ceci. Votre solution et bien d'autres à cette réponse manquent d'un détail important. Si vous n'affectez pas la fonction utilisée dans setInterval
(dans votre cas ConnectButton
) à une variable, il n'y a donc aucun moyen de la référencer si vous devez l'arrêter pour une raison quelconque (en utilisant clearInterval
. Pourriez-vous mettre à jour votre réponse pour affecter ConnectButton
à un variable et envoyez cette variable à setInterval
? ie var connectButton = function ConnectButton {...}; setInterval(connectButton, 60000)
@KolaB ou vous pouvez simplement actualiser la page. Selon ce que je comprends, colab ne déconnecte pas la session si la page est actualisée.
Utilisation du sélénium 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()
Je ne pense plus que les solutions JavaScript fonctionnent. Je le faisais depuis mon cahier avec:
Connect pushed Uncaught TypeError: Cannot read property 'click' of null at ConnectButton (<anonymous>:1:92)
Lorsque vous effectuez pour la première fois un Exécuter tout (avant le démarrage du code JavaScript ou Python), la console affiche:
Connected to wss://colab.research.google.com/api/kernels/0e1ce105-0127-4758-90e48cf801ce01a3/channels?session_id=5d8...
Cependant, à chaque fois que JavaScript s'exécute, vous voyez la partie console.log, mais la partie clic donne simplement:
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))
D'autres ont suggéré que le nom du bouton a changé en # colab-connect-button, mais cela donne la même erreur.
Une fois l'exécution lancée, le bouton est modifié pour afficher RAM / DISQUE, et une liste déroulante s'affiche. Cliquer sur le menu déroulant crée un nouveau <DIV class=goog menu...>
qui n'était pas affiché dans le DOM auparavant, avec 2 options "Se connecter au runtime hébergé" et "Se connecter au runtime local". Si la fenêtre de la console est ouverte et affiche des éléments, vous pouvez voir ce DIV apparaître lorsque vous cliquez sur l'élément déroulant. Déplacer simplement le focus de la souris entre les deux options dans la nouvelle fenêtre qui apparaît ajoute des éléments supplémentaires au DOM, dès que la souris perd le focus, ils sont complètement supprimés du DOM, même sans cliquer.
d'accord, y a-t-il une solution
Eh bien, cela fonctionne pour moi -
exécutez le code suivant dans la console et cela vous empêchera de vous déconnecter. Ctrl + Maj + i pour ouvrir la vue de l'inspecteur. Ensuite, allez à la console.
function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button#connect").click() } setInterval(ClickConnect,60000)
Merci, cela fonctionne bien pour moi aussi. (J'ai laissé le même commentaire ici la semaine dernière mais il a disparu. Il est important de ne pas perdre de travail, donc cette réponse mérite un retour positif.)
Ne fonctionne pas, est toujours déconnecté. (Utilisation du navigateur Firefox 74.0 (64 bits)).
Cela fonctionne-t-il également même si vous laissez la fenêtre du navigateur réduite au minimum et travaillez avec d'autres applications?
créez un code python dans votre pc avec pynput
from pynput.mouse import Button, Controller import time mouse = Controller() while True: mouse.click(Button.left, 1) time.sleep(30)
Exécutez ce code dans votre bureau, puis pointez la flèche de la souris sur la structure du répertoire (panneau de gauche colabs - section fichier) sur n'importe quel répertoire sur lequel ce code continuera à cliquer sur le répertoire toutes les 30 secondes afin qu'il s'agrandisse et se rétrécisse toutes les 30 secondes afin que votre session ne soit pas obtenir expiré Important - vous devez exécuter ce code sur votre PC
J'ai essayé cela et j'ai obtenu une DisplayNameError lorsque j'import pynput. C'est peut-être parce que nous ne pouvons accéder à colab que via un navigateur (dans une session d'exécution hébergée) et non par clavier / souris, etc.
Je pense que vous avez mal compris l'idée. Colab n'est pas accessible avec python. Seule votre souris contrôlée par le code ci-dessus (car pour simuler, l'interaction de la souris avec le navigateur) .Résolution des problèmes de bibliothèque dans le PC local
Les réponses ci-dessus à l'aide de certains scripts fonctionnent peut-être bien. J'ai une solution (ou une sorte d'astuce) pour cette déconnexion ennuyeuse sans scripts, en particulier lorsque votre programme doit lire les données de votre lecteur Google, comme entraîner un modèle de réseau d'apprentissage en profondeur, où l'utilisation de scripts pour effectuer une opération de reconnect
est inutile car une fois que vous vous êtes déconnecté de votre colab, le programme est juste mort, vous devez vous reconnecter manuellement à votre lecteur Google pour que votre modèle puisse à nouveau lire l'ensemble de données, mais les scripts ne le feront pas.
Je l'ai déjà testé plusieurs fois et cela fonctionne bien.
Lorsque vous exécutez un programme sur la page colab avec un navigateur (j'utilise Chrome), rappelez-vous simplement que n'effectuez aucune opération sur votre navigateur une fois que votre programme démarre, comme: passer à d'autres pages Web, ouvrir ou fermer une autre page Web, et ainsi de suite, laissez-le tranquille là-bas et attendez que votre programme se termine, vous pouvez passer à un autre logiciel, comme pycharm, pour continuer à écrire vos codes mais pas passer à une autre page Web. Je ne sais pas pourquoi ouvrir ou fermer ou basculer vers d'autres pages causera le problème de connexion de la page google colab, mais chaque fois que j'essaye de déranger mon navigateur, comme faire un travail de recherche, ma connexion à colab va bientôt tomber en panne.
J'ajouterai à votre réponse que Firefox fonctionne bien avec cette astuce. Mais pour moi, j'ai désactivé le mode veille sur mon mac et placé la fenêtre du navigateur devant toutes les autres fenêtres comme si je travaillais activement dessus. Je l'ai gardé toute la nuit et ça marche. Aucune des astuces javascript n'a fonctionné. Une remarque est que j'utilise Google Colab Pro: je ne suis donc pas sûr que cela fonctionnera avec colab gratuit.
@Yasser Sinjab Merci pour vos ajouts, j'utilise la version gratuite et cela fonctionne bien.
J'ai essayé les codes ci-dessus mais ils n'ont pas fonctionné pour moi. Voici donc mon code JS pour la reconnexion.
let interval = setInterval(function(){ let ok = document.getElementById('ok'); if(ok != null){ console.log("Connect pushed"); ok.click(); }},60000)
Vous pouvez l'utiliser de la même manière (exécutez-le sur la console de votre navigateur) pour l'exécuter. Si vous souhaitez arrêter le script, vous pouvez entrer clearInterval(interval)
et vous voulez réexécuter setInterval(interval)
.
J'espère que ceci vous aide.
Celui-ci a fonctionné pour moi (il semble qu'ils aient changé le nom de classe ou l'id du bouton):
function ClickConnect(){ console.log("Working"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
Puisque l'id du bouton de connexion est maintenant changé en "colab-connect-button", le code suivant peut être utilisé pour continuer à cliquer sur le bouton.
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("Put ID here").click() // Change id here } setInterval(ClickConnect,60000)
Si toujours, cela ne fonctionne pas, suivez les étapes ci-dessous:
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
Il s'agit de la solution actuelle selon le nouvel ID de bouton (février-2020)
Si Google essaie de faire en sorte que cela ne fonctionne pas (exemple: en faire une classe et avoir plusieurs faux boutons invisibles avec cette même classe), vous pouvez toujours au lieu de l'étape 3: clic droit -> Copier -> Copier le chemin JS
Toujours le même problème Runtime déconnecté, Le runtime déconnecté en raison de l'inactivité
Comment puis-je arrêter ce script de s'exécuter?
@MurtazaKamal Crtl + Shift + I, allez aux sources et cliquez sur le bouton pause.
Essaye ça:
function ClickConnect(){ console.log("Working"); document .querySelector("#top-toolbar > colab-connect-button") .shadowRoot .querySelector("#connect") .click() } setInterval(ClickConnect,60000)
Pour moi, les exemples suivants:
document.querySelector("#connect").click()
oudocument.querySelector("colab-toolbar-button#connect").click()
oudocument.querySelector("colab-connect-button").click()
jetaient des erreurs.
J'ai dû les adapter aux éléments suivants:
Version 1:
stopClickConnect();
Version 2: Si vous souhaitez pouvoir arrêter la fonction, voici le nouveau 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();
Pour arrêter, appelez:
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)
Pour moi, c'est la seule solution qui ne génère pas d'erreur. Merci
J'ai essayé les méthodes ci-dessus et quelques autres blogs. De loin, et pertinents à l'heure actuelle, vos deux codes fonctionnent sans erreur. Merci :)
Je recommanderais d'utiliser JQuery (il semble que Co-lab inclut JQuery par défaut).
function ClickConnect(){ console.log("Working"); $("colab-toolbar-button").click(); } setInterval(ClickConnect,60000);
Celui-ci ne fonctionne pas: Uncaught ReferenceError: $ is not defined at ClickConnect (<anonymous>:3:3)
Vous pouvez également utiliser Python pour appuyer sur les touches fléchées. J'ai également ajouté un peu d'aléatoire dans le code suivant.
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])
par la façon dont vous voulez probablement accéder au contenu du array
, ce code semble être entièrement déterminé à appuyer sur L, R, U, D à chaque fois
Pourquoi pas for key in array: press(key)
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("connect").click() // Change id here } setInterval(ClickConnect,60000) Try above code it worked for me:)
J'ai un problème avec ces fonctions javascript:
function ClickConnect(){ document.querySelector("colab-connect-button").click() console.log("Clicked on connect button"); } setInterval(ClickConnect,60000)
Ils impriment le "Cliqué sur le bouton de connexion" sur la console avant que le bouton ne soit réellement cliqué. Comme vous pouvez le voir à partir de différentes réponses dans ce fil, l'id du bouton de connexion a changé plusieurs fois depuis le lancement de Google Colab. Et cela pourrait aussi être changé à l'avenir. Donc, si vous allez copier une ancienne réponse de ce fil de discussion, il se peut qu'il dise "Cliqué sur le bouton de connexion", mais il se peut qu'il ne le fasse pas. Bien sûr, si le clic ne fonctionne pas, une erreur s'affichera sur la console, mais que faire si vous ne le voyez pas accidentellement? Alors tu ferais mieux de faire ceci:
function ClickConnect(){ console.log("Clicked on connect button"); document.querySelector("colab-connect-button").click() } setInterval(ClickConnect,60000)
Et vous verrez certainement si cela fonctionne vraiment ou non.
Je cherchais une solution jusqu'à ce que je trouve un Python3 qui déplace aléatoirement la souris d'avant en arrière et clique, toujours au même endroit, mais cela suffit pour tromper Colab en lui faisant croire que je suis actif sur le portable et ne me déconnecte pas.
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()
Vous devez installer les packages nécessaires: sudo -H pip3 install <package_name>
Il vous suffit de l'exécuter (dans votre machine locale) avec sudo
(car il prend le contrôle de la souris) et cela devrait fonctionner, vous permettant de profiter pleinement des 12h sessions de Colab.
Crédits: Pour ceux qui utilisent Colab (Pro): Empêcher la session de se déconnecter en raison de l'inactivité
Je suppose que vous voudriez également le mettre dans un fil séparé: D
@FalconUA, Hier soir, j'ai laissé Colab tourner sur mon PC et quand je me suis réveillé le matin, je l'ai trouvé toujours en marche. Je suppose que le script fonctionne bien, mais j'ai quelques avertissements concernant le fil, vous avez raison.
function ClickConnect() { console.log("Working...."); document.querySelector("paper-button#comments").click() } setInterval(ClickConnect,600) this worked for me but use wiselyhappy learning :)
la DERNIÈRE solution suivante fonctionne pour moi:
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)
Pensez à inclure une explication pour votre réponse.
Le javascript ci-dessous fonctionne pour moi. Crédits à @ 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);
Dans le notebook Colab, cliquez simultanément sur Ctrl + Maj + la touche i
. Copiez et collez le script dans la ligne d'invite. Appuyez ensuite sur Enter
avant de fermer l'éditeur.
Ce faisant, la fonction vérifiera toutes les 60 secondes pour voir si la boîte de dialogue de connexion à l'écran est affichée, et si c'est le cas, la fonction cliquera alors automatiquement sur le bouton ok
pour vous.
Exécutez simplement le code ci-dessous après la cellule que vous souhaitez exécuter pour éviter la perte de données.
exit()
Également pour quitter ce mode, écrivez
!python
Eh bien, je ne suis pas un gars python et je ne sais pas quelle est l'utilisation réelle de ce 'Colab', je l'utilise comme système de construction lol. Et j'avais l'habitude de configurer le transfert ssh, puis de mettre ce code et de le laisser fonctionner et oui, cela fonctionne.
import getpass authtoken = getpass.getpass()
Mis à jour un. ça marche pour moi.
clearInterval(myjob)
Si cela ne vous convient pas, essayez de l'effacer en exécutant:
function ClickConnect(){ console.log("Working"); document.querySelector("paper-icon-button").click() } Const myjob = setInterval(ClickConnect, 60000)
Au lieu de cliquer sur le bouton de connexion, je clique simplement sur le bouton de commentaire pour maintenir ma session en vie. (Août-2020)
function ClickConnect(){ console.log("Working"); document.querySelector("#comments > span").click() } setInterval(ClickConnect,5000)
La réponse la plus votée fonctionne certainement pour moi, mais elle fait apparaître encore et encore la fenêtre Gérer la session.
J'ai résolu cela en cliquant automatiquement sur le bouton d'actualisation à l'aide de la console du navigateur comme ci-dessous
function ClickRefresh(){ console.log("Clicked on refresh button"); document.querySelector("paper-icon-button").click() } setInterval(ClickRefresh, 60000)
N'hésitez pas à contribuer plus d'extraits pour cela à ce sujet: https://gist.github.com/Subangkar/fd1ef276fd40dc374a7c80acc247613e
Ce code continue de cliquer sur "Refresh folder" dans le volet de l'explorateur de fichiers.
function ClickRefresh(){ console.log("Working"); document.querySelector("[icon='colab:folder-refresh']").click() } const myjob = setInterval(ClickRefresh, 60000)
Notez que le volet de l'explorateur de fichiers / dossier doit être développé pour que celui-ci fonctionne.
GNU Colab vous permet d'exécuter un environnement de bureau persistant standard au-dessus d'une instance Colaboratory.
En effet, il contient un mécanisme pour ne pas laisser les machines mourir du ralenti.
Voici une démonstration vidéo .
Peut-être que plusieurs des solutions précédentes ne fonctionnent plus. Par exemple, ce code ci-dessous continue de créer de nouvelles cellules de code dans Colab, mais fonctionne bien. Sans aucun doute, créer un tas de cellules de code est un inconvénient. Si trop de cellules de code sont créées en quelques heures de fonctionnement et qu'il n'y a pas assez de RAM, le navigateur peut se figer.
Cela crée à plusieurs reprises des cellules de code -
function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button#connect").click() }setInterval(ClickConnect,120000)
Mais j'ai trouvé que le code ci-dessous fonctionne, cela ne pose aucun problème. Dans l'onglet Bloc-notes Colab, cliquez simultanément sur la Ctrl + Shift + i
et collez le code ci-dessous dans la console. 120000 intervalles suffisent.
function ClickConnect(){ console.log("Working"); document.querySelector("colab-toolbar-button").click() }setInterval(ClickConnect,60000)
J'ai testé ce code dans Firefox, en novembre 2020. Il fonctionnera également sur Chrome.
Je me posais aussi la même question. Serait utile pour les étudiants pendant la durée de leur soutenance de thèse.
"Délai d'inactivité de 90 minutes ... si un utilisateur n'interagit pas avec son ordinateur portable Google Colab pendant plus de 90 minutes, son instance est automatiquement interrompue." C'est mauvais car kerastuner est alors impossible à utiliser. Le personnel de Google doit réfléchir davantage s'il veut vraiment que le public utilise kerastuner.
Comment puis-je arrêter ce script de s'exécuter?
Pas un code mais une petite touche de poids et de retour arrière sur votre système peut faire l'affaire pour vous. J'espère que vous avez compris!