返回筆記列表

Jupyterlab 使用

Study

背景知識

  1. JupyterLab 的運作機制

    • JupyterLab 是一個前端界面,負責顯示和編輯 Notebook,但實際執行程式碼的是後端的 kernel
    • Kernel 是獨立的執行環境,負責運行 Python(或其他語言)程式碼。JupyterLab 透過 jupyter_server 與 kernel 通信。
  2. Kernel 的來源

    • 默认情况下,安装 JupyterLab 時會附帶一個預設的 Python kernel(通常是安裝 JupyterLab 的環境)。
    • 你可以添加其他 kernel,例如來自不同 Conda 環境、虛擬環境,甚至其他 Python 安裝。
  3. 乾淨環境假設

    • 你提到「乾淨 Python 3.12.9 環境」,假設只有 Python 3.12.9 和 JupyterLab,沒有其他套件(如 numpypandas)。

問題解答

Q1: 純安裝 JupyterLab 後,使用其他 kernel 時需要額外安裝套件嗎?

  • 不需要在 JupyterLab 環境中額外安裝套件,但 取決於你使用的 kernel 是否已經包含所需套件
  • 詳細說明:
    • JupyterLab 本身只負責界面和 kernel 管理,不執行程式碼,因此它不需要知道你的程式碼依賴哪些套件。
    • 當你切換到其他 kernel(例如另一個 Conda 環境的 Python kernel),程式碼會在該 kernel 的環境中運行,使用的套件來自該 kernel 的環境,而不是 JupyterLab 的環境。
    • 如果該 kernel 的環境缺少運行程式碼所需的套件(例如 numpy),你需要在該 kernel 的環境中安裝這些套件,而不是在 JupyterLab 的環境中。

Q2: JupyterLab 是使用 kernel 來跑 Python 嗎?

  • 是的,JupyterLab 完全依賴 kernel 來運行 Python 程式碼。
  • 流程:
    1. 你在 JupyterLab 的 Notebook 中輸入程式碼。
    2. JupyterLab 將程式碼發送到當前選定的 kernel。
    3. Kernel 執行程式碼並將結果返回給 JupyterLab 顯示。
  • 因此,JupyterLab 本身不包含 Python 執行環境,所有執行邏輯都由 kernel 提供。

額外注意

  • Python 3.12 的相容性
    • 如前所述,Python 3.12 是較新版本,某些套件(例如舊版 jupyter_server)可能有相容性問題。如果遇到錯誤(如 pysqlite2),考慮降級到 Python 3.11。
  • Kernel 清單管理
    • 查看已註冊的 kernel:
      jupyter kernelspec list
      
    • 移除不需要的 kernel:
      jupyter kernelspec remove ml_env
      

在 JupyterLab 中使用其他環境

  • 你已經安裝了 JupyterLab(例如在一個名為 jupyter_env 的 Conda 環境中)。
  • 你有其他環境(例如 data_envml_env),這些環境包含你想使用的套件或特定 Python 版本。

步驟:將其他環境加入 JupyterLab

步驟 1: 在目標環境中安裝 ipykernel

  • 每個你想用作 kernel 的環境都需要安裝 ipykernel,這樣它才能與 JupyterLab 通信。
  1. 啟動目標環境:

    conda activate data_env
    
  2. 安裝 ipykernel

    conda install -c conda-forge ipykernel
    

步驟 2: 註冊環境作為 kernel

  • 使用 ipykernel 將該環境註冊到 Jupyter 的 kernel 清單中。
  1. 在目標環境中運行以下命令:

    python -m ipykernel install --user --name data_env --display-name "Data Env (Python 3.11)"
    
    • --user:將 kernel 安裝到使用者層級(~/.local/share/jupyter/kernels/)。
    • --name data_env:kernel 的內部名稱(建議與環境名稱一致)。
    • --display-name "Data Env (Python 3.11)":JupyterLab 中顯示的名稱(可自訂)。
  2. 重複此步驟,為每個想使用的環境註冊 kernel。例如:

    conda activate ml_env
    conda install -c conda-forge ipykernel
    python -m ipykernel install --user --name ml_env --display-name "ML Env (Python 3.10)"
    

步驟 3: 啟動 JupyterLab

  • 返回安裝 JupyterLab 的環境(例如 jupyter_env):
    conda activate jupyter_env
    jupyter lab
    

步驟 4: 在 JupyterLab 中選擇其他環境

  1. 新建 Notebook

    • 在 JupyterLab 界面中,點擊左上角的「+」按鈕,選擇「Notebook」。
  2. 選擇 Kernel

    • 彈出窗口會顯示可用的 kernel 清單。
    • 選擇你剛註冊的 kernel,例如 "Data Env (Python 3.11)" 或 "ML Env (Python 3.10)"。
    • 點擊「Select」。
  3. 切換現有 Notebook 的 Kernel

    • 如果已經打開一個 Notebook:
      • 點擊頂部菜單的「Kernel」 > 「Change Kernel」。
      • 從下拉清單中選擇目標 kernel(例如 "Data Env (Python 3.11)")。
      • 確認後,Notebook 會重新連接到新 kernel。
  4. 驗證

    • 在 Notebook 中運行:
      import sys
      print(sys.executable)  # 顯示當前 kernel 的 Python 路徑
      import numpy  # 測試套件是否可用
      
    • 如果路徑指向 data_env(例如 /home/user/miniconda3/envs/data_env/bin/python),且套件正常導入,說明成功使用該環境。

管理 Kernel

查看已註冊的 Kernel

jupyter kernelspec list
  • 輸出示例:
    Available kernels:
      data_env    /home/user/.local/share/jupyter/kernels/data_env
      ml_env      /home/user/.local/share/jupyter/kernels/ml_env
      python3     /home/user/miniconda3/envs/jupyter_env/share/jupyter/kernels/python3
    

移除不需要的 Kernel

  • 如果不再需要某個 kernel:
    jupyter kernelspec remove data_env
    

注意事項

  1. JupyterLab 環境無需包含所有套件

    • 如前所述,JupyterLab 的環境(例如 jupyter_env)只需安裝 jupyterlab,無需安裝其他 kernel 環境中的套件(例如 numpytensorflow)。
  2. Kernel 環境必須獨立完整

    • 每個 kernel 環境(例如 data_env)需要包含運行程式碼所需的套件。如果缺少,會報錯(如 ModuleNotFoundError)。
  3. 跨系統移植

    • 如果你在 WSL 或其他系統打包環境並移植到新機器,kernel 的註冊資訊不會隨 conda-pack 一起移動,需在新機器上重新運行 python -m ipykernel install
  4. 多版本 Python

    • 你可以用不同 Python 版本的環境作為 kernel(例如 Python 3.11、3.12),只要它們都安裝了 ipykernel

完整範例

假設你有以下環境:

  • jupyter_env:Python 3.12,只安裝 JupyterLab。
  • data_env:Python 3.11,包含 numpypandas

配置流程:

# 配置 JupyterLab 環境
conda create -n jupyter_env python=3.12
conda activate jupyter_env
conda install -c conda-forge jupyterlab

# 配置數據分析環境
conda create -n data_env python=3.11
conda activate data_env
conda install -c conda-forge numpy pandas ipykernel
python -m ipykernel install --user --name data_env --display-name "Data Env (Python 3.11)"

# 啟動 JupyterLab
conda activate jupyter_env
jupyter lab

在 JupyterLab 中:

  • 新建 Notebook,選擇 "Data Env (Python 3.11)"。
  • 運行:
    import numpy as np
    print(np.__version__)
    
  • 成功輸出版本號,證明使用的是 data_env 的 kernel。

在使用 sqlite_web 遠端存取 SQLite 資料庫時,需要了解 sqlite_web 是一個基於 Python 的工具,它提供了一個網頁介面來管理和查詢本地的 SQLite 資料庫檔案。預設情況下,sqlite_web 是設計來在本地機器上運行的,並不直接支援遠端存取。然而,透過一些配置和網路設定,你可以實現遠端進入的效果。以下是步驟和說明:


遠端連線

在遠端存取 JupyterLab 的過程中,配置方式與 sqlite_web 有相似之處,但 JupyterLab 本身提供了更多的選項和安全性功能,例如密碼保護和 SSL 加密。以下是詳細的步驟,說明如何設定 JupyterLab 以實現遠端連線:


1. 安裝 JupyterLab

假設你在遠端主機上尚未安裝 JupyterLab,可以使用以下指令安裝:

pip install jupyterlab

2. 配置 JupyterLab

JupyterLab 需要一些基本配置來允許遠端存取。以下是設定步驟:

(1) 生成配置文件

首次運行 JupyterLab 時,生成預設配置文件:

jupyter lab --generate-config

這會在 ~/.jupyter/jupyter_lab_config.py 中創建一個配置文件。

(2) 修改配置文件

編輯剛剛生成的配置文件(例如使用 nanovim):

nano ~/.jupyter/jupyter_lab_config.py

找到以下幾行並修改(如果沒有這些行,可以直接新增):

c.ServerApp.ip = '0.0.0.0'  # 監聽所有網路介面,允許外部連線
c.ServerApp.port = 8888      # 指定端口(預設是 8888,可自訂)
c.ServerApp.open_browser = False  # 不自動打開本地瀏覽器
c.ServerApp.allow_remote_access = True  # 允許遠端存取

(3) 設定密碼(可選,但強烈建議)

為了安全性,可以設定一個登入密碼。運行以下指令生成密碼:

jupyter lab password

系統會提示你輸入並確認密碼,然後將加密後的密碼儲存到配置文件中(通常在 ~/.jupyter/jupyter_server_config.json)。啟動 JupyterLab 後,訪問時會要求輸入此密碼。


3. 啟動 JupyterLab

在遠端主機上啟動 JupyterLab:

jupyter lab

如果配置文件已正確設定,JupyterLab 會監聽 0.0.0.0:8888,並允許外部連線。

你也可以直接在命令列中指定參數(如果不想修改配置文件):

jupyter lab --ip=0.0.0.0 --port=8888 --no-browser

4. 檢查防火牆和網路設定

sqlite_web 類似,你需要確保遠端主機的防火牆和網路設定允許連線到 JupyterLab 的端口(例如 8888)。

使用 ufw(Ubuntu)

sudo ufw allow 8888
sudo ufw status

使用 firewalld(CentOS/RHEL)

sudo firewall-cmd --add-port=8888/tcp --permanent
sudo firewall-cmd --reload

如果使用雲端服務(例如 AWS、GCP、Azure),需要在安全群組中開放對應端口。


5. 從本地端遠端存取

在本地端的瀏覽器中輸入以下網址:

http://遠端主機的IP位址:8888

例如,如果遠端主機的公共 IP 是 192.168.1.100,則輸入:

http://192.168.1.100:8888

如果設定了密碼,頁面會提示你輸入密碼以登入。


6. 安全性建議

JupyterLab 直接暴露在公開網路上可能有安全風險。以下是幾個提升安全性的方法:

(1) 使用 SSL 加密

為了防止資料在傳輸過程中被攔截,建議啟用 HTTPS:

  • 生成自簽名憑證:
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
    
  • 修改配置文件,加入憑證路徑:
    c.ServerApp.certfile = '/path/to/mycert.pem'
    c.ServerApp.keyfile = '/path/to/mykey.key'
    
  • 啟動後,使用 https://遠端主機IP:8888 存取。

(2) 使用 SSH 隧道

sqlite_web 類似,SSH 隧道是更安全的存取方式:

  1. 在本地端執行:
    ssh -L 8888:localhost:8888 user@遠端主機IP
    
  2. 在遠端主機上啟動 JupyterLab,監聽本地:
    jupyter lab --ip=127.0.0.1 --port=8888
    
  3. 在本地瀏覽器輸入 http://localhost:8888,即可透過隧道存取。

(3) 使用 Token 驗證

JupyterLab 啟動時會生成一個隨機 Token(顯示在終端機輸出中,例如 http://.../?token=xyz)。你可以保留此機制,並在存取時手動輸入 Token,而不是設定固定密碼。


7. 注意事項

  • 後台運行:如果想讓 JupyterLab 在關閉終端後繼續運行,可以使用 nohupscreen
    nohup jupyter lab --ip=0.0.0.0 --port=8888 --no-browser &
    
  • 資源限制:JupyterLab 可能會消耗大量記憶體,特別是在執行大型程式時。確保遠端主機有足夠資源。
  • 多用戶支援:如果你需要多人使用,考慮使用 JupyterHub,它是為多用戶環境設計的擴展版本。

總結

要遠端連線到 JupyterLab,最簡單的方式是修改配置文件並開放端口,但為了安全性,建議搭配密碼、SSL 或 SSH 隧道使用。根據你的需求(例如單人使用還是多人協作),可以選擇不同的配置方式。如果有更具體的問題(例如作業系統或網路環境),請告訴我,我可以提供更精確的建議!