見出し画像

本格的なエロチャットAIを作りたい その6(Google Colabのランタイムへの接続/切断削除をローカルPCから行う)

前回検証したとおり、リソースの無駄遣いを最小限に抑えるため、ローカルPCからランタイムへの接続/切断削除を行うようにする。

Google colabのランタイムへの接続/切断削除は意外と簡単

pyautoguiを使って、ローカルPCのブラウザ上のGoogle Colabを制御する。

# Google Colabを起動させる関数を定義
# 開いている「LLM_API.ipynb - Colab」タブをフォーカスし、Ctrl+F9(すべてのセルを実行)をスローする
def focus_browser_and_send_startup_shortcut():
    # ブラウザのウィンドウタイトルの一部(例:'Chrome'や'Firefox')
    browser_title = 'LLM_API.ipynb - Colab'  # 使用しているブラウザに応じて変更してください
    try:
        # ブラウザウィンドウを探してアクティブにする
        window = pyautogui.getWindowsWithTitle(browser_title)[0]
        window.activate()
        # ウィンドウがアクティブになるまで少し待つ
        time.sleep(1)
        # Ctrl+F9のショートカットを送信
        pyautogui.hotkey('ctrl', 'f9')
        print(f"ショートカット Ctrl+F9 を {browser_title} に送信しました。")
    except IndexError:
        print(f"エラー: '{browser_title}' というタイトルのウィンドウが見つかりません。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")


# Google Colabを終了させる関数を定義
# 開いている「LLM_API.ipynb - Colab」タブをフォーカスし、Ctrl+F1(「ランタイムを接続解除して削除」に割り当てたショートカット)をスローし、
# Pop upが出るのでEnterキーを送って終了させる
def focus_browser_and_send_shutdown_shortcut():
    # ブラウザのウィンドウタイトルの一部(例:'Chrome'や'Firefox')
    browser_title = 'LLM_API.ipynb - Colab'  # 使用しているブラウザに応じて変更してください
    try:
        # ブラウザウィンドウを探してアクティブにする
        window = pyautogui.getWindowsWithTitle(browser_title)[0]
        window.activate()
        # ウィンドウがアクティブになるまで少し待つ
        time.sleep(1)
        # Ctrl+F1のショートカットを送信
        pyautogui.hotkey('ctrl', 'f1')
        print(f"ショートカット Ctrl+F1 を {browser_title} に送信しました。")
        time.sleep(5)
        # ENTERを送信
        pyautogui.press('enter')
        print(f"Enter を {browser_title} に送信しました。")
    except IndexError:
        print(f"エラー: '{browser_title}' というタイトルのウィンドウが見つかりません。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

ランタイムの接続はショートカット(ctrl+F9)があるので簡単。
ランタイムの切断と削除はyソートカットがないが、ツール→キーボードショートカットでショートカットを設定できるので、ctrl+F1を割り当てた。
ただこれを実行するとポップアップが出るので、Enterキーも割り当てて終了させるようにした。

追記:2024/08/21
def focus_browser_and_send_shutdown_shortcut() の処理を以下のように変更した。

def focus_browser_and_send_shutdown_shortcut():
    global status,browser_title    
    try:
        # ブラウザウィンドウを探してアクティブにする
        window = pyautogui.getWindowsWithTitle(browser_title)[0]
        window.activate()
        # ウィンドウがアクティブになるまで少し待つ
        time.sleep(1)
        # Ctrl+M Iのショートカットを送信
        pyautogui.hotkey('ctrl', 'm', 'i')
        print(f"ショートカット Ctrl+M I を {browser_title} に送信しました。")
        time.sleep(5)
        # Ctrl+F1のショートカットを送信
        pyautogui.hotkey('ctrl', 'f1')
        print(f"ショートカット Ctrl+F1 を {browser_title} に送信しました。")
        time.sleep(5)
        # ENTERを送信
        pyautogui.press('enter')
        print(f"Enter を {browser_title} に送信しました。")
    except IndexError:
        print(f"エラー: '{browser_title}' というタイトルのウィンドウが見つかりません。")
        status = 'ERROR'
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        status = 'ERROR'
    else:
        print('正常に終了しました')
        status = 'LLM_CLOSE'

ポイントは、 Ctrl+M Iのショートカット(実行を中断)の送信を追加したこと。
これをせずにリソースを削除すると、通信がすぐに終わらない。
感触的だが、バッファに入ったものが実行されている感じ。
なので、削除してからも数回通信が行われる。
別途記述するが、Google Colab側が正しく終了していることを「通信のリクエストがこない」ことで確認しようとしているが、この現象があるとそれが怪しくなっていくためだ。

この記事が気に入ったらサポートをしてみませんか?