Tóm tắt nhanh:
- Giải pháp: Chạy mô hình LLM lớn (20B parameters) trên GPU T4 miễn phí của Google Colab và kết nối về VSCode local.
- Hiệu suất: Tốc độ xử lý <5s cho request thông thường, khắc phục hoàn toàn giới hạn VRAM của máy cá nhân.
- Kiến trúc: VSCode + Continue Extension ↔ Local Proxy ↔ Ngrok Tunnel ↔ Google Colab (Ollama Server).
- Lợi ích: Sở hữu AI Coding Assistant mạnh mẽ, riêng tư mà không tốn chi phí phần cứng hay API.
Kết quả đạt được sau khi triển khai
Bạn sẽ có một Coding Assistant Chatbot chạy ngay trên VSCode với tốc độ xử lý siêu mượt. Hệ thống này giải quyết triệt để vấn đề giật lag khi chạy local model trên các máy có cấu hình tầm trung (dưới 16GB VRAM).
Thay vì mất 3-5 phút cho một query trên máy local (16GB RAM + 6GB GPU), giải pháp này giảm thời gian phản hồi xuống dưới 5 giây cho các request thông thường và khoảng 30 giây cho các request có embedded code phức tạp.
Tại sao không chạy trực tiếp trên máy Local?
Thực tế cho thấy, việc chạy các mô hình mã nguồn mở chất lượng cao như gpt-oss:20b đòi hỏi phần cứng rất mạnh.
- Yêu cầu VRAM: Cần tối thiểu 16GB VRAM để mô hình hoạt động mượt mà.
- Thực trạng phổ biến: Đa số laptop hoặc PC cá nhân chỉ có 16GB RAM hệ thống và 4-8GB GPU. Khi cố ép chạy, hệ thống sẽ phải swap bộ nhớ liên tục, dẫn đến độ trễ cực cao.
Nếu bạn sở hữu GPU RTX 3090/4090 (24GB VRAM), bạn có thể chạy native. Tuy nhiên, nếu không đủ tài nguyên, giải pháp Cloud GPU miễn phí từ Google Colab là lựa chọn tối ưu nhất.
Kiến trúc hệ thống
Quy trình hoạt động dựa trên việc "mượn" sức mạnh tính toán từ Google và chuyển tiếp kết quả về máy local:
- Server: Chạy Ollama trên Google Colab (sử dụng T4 GPU 16GB miễn phí).
- Tunneling: Tạo đường hầm bảo mật qua Ngrok để public cổng kết nối của Colab.
- Proxy: Sử dụng script Python local để xử lý xác thực (Authentication).
- Client: Kết nối VSCode Continue extension tới Proxy local.
Sơ đồ luồng dữ liệu:
[VSCode + Continue] ↔ [VSCode Local Proxy] ↔ [Ngrok Tunnel + Auth] ↔ [Google Colab + Ollama Server]
Hướng dẫn cài đặt chi tiết
Bước 1: Chuẩn bị môi trường Google Colab
Để bắt đầu, bạn cần thiết lập runtime có GPU và cấu hình các thông số bảo mật.
- Truy cập Google Colab và tạo Notebook mới.
- Điều chỉnh Runtime: Chọn Runtime → Change runtime type → Chọn T4 GPU.
- Cấu hình Secrets (Bảo mật): Vào mục Secrets (biểu tượng chìa khóa bên trái) và thêm 2 biến môi trường:
-
NGROK_TOKEN: Lấy từ dashboard của ngrok.com. -
OLLAMA_PASS: Đặt mật khẩu tùy ý (sẽ được mã hóa SHA256 để bảo vệ endpoint).
-
Bước 2: Tạo Script Server trên Google Drive
Việc lưu script trên Drive giúp bạn tái sử dụng dễ dàng mà không cần copy-paste lại code mỗi lần khởi động. Tạo thư mục /MyDrive/ollama-collab và upload file server_app.py với nội dung sau:
import os
import subprocess
import time
import hashlib
from dotenv import load_dotenv
def setup():
load_dotenv()
token = os.getenv('NGROK_TOKEN')
user = os.getenv('OLLAMA_USER', 'admin')
raw_pass = os.getenv('OLLAMA_PASS', 'your-password-here')
print("1. Installing Dependencies...")
os.system("sudo apt-get update > /dev/null")
os.system("sudo apt-get install zstd jq -y > /dev/null")
print("2. Installing Ollama & Ngrok...")
os.system("curl -fsSL https://ollama.com/install.sh | sh")
os.system("curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null")
os.system('echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list > /dev/null')
os.system("sudo apt update > /dev/null && sudo apt install ngrok -y > /dev/null")
print("\n3. Starting Ollama Server...")
os.environ['OLLAMA_HOST'] = '0.0.0.0' # Allow external connections
os.environ['OLLAMA_ORIGINS'] = '*' # CORS for all origins
os.system("pkill -9 ollama || true")
os.system("nohup ollama serve > ollama.log 2>&1 &")
# Wait for Ollama to start
print("Waiting for Ollama to wake up...")
for _ in range(10):
if "127.0.0.1:11434" in subprocess.getoutput("netstat -tuln"):
print("✅ Ollama is listening.")
break
time.sleep(2)
print("\n4. Checking Model: gpt-oss:20b")
models = subprocess.getoutput("ollama list")
if "gpt-oss:20b" not in models:
print("Model not found. Pulling now (this takes time)...")
os.system("ollama pull gpt-oss:20b") # ~12GB download
else:
print("✅ Model already exists.")
print("\n5. Starting Ngrok Tunnel...")
hashed_pass = hashlib.sha256(raw_pass.encode()).hexdigest()
os.system("pkill -9 ngrok || true")
os.system(f"nohup ngrok http 11434 --authtoken {token} --basic-auth {user}:{hashed_pass} > ngrok.log 2>&1 &")
# Wait for tunnel URL
print("Waiting for URL...")
url = ""
for _ in range(30):
time.sleep(2)
url = subprocess.getoutput("curl -s http://localhost:4040/api/tunnels | jq -r '.tunnels[0].public_url'")
if url and url != "null": break
if not url or url == "null":
print("❌ Ngrok Error. Check ngrok.log")
return
print("\n" + "="*50)
print(f"🚀 SERVER LIVE")
print(f"MODEL: gpt-oss:20b")
print(f"URL: {url}")
print("="*50)
print(f'\n# Copy dòng này để chạy trên Windows PowerShell:')
print(f'$env:OLLAMA_HOST="{url}"; $env:OLLAMA_USERNAME="{user}"; $env:OLLAMA_PASSWORD="{hashed_pass}"; python chat.py')
print("="*50)
# Keep alive
while True:
time.sleep(600)
print(f"Heartbeat: {time.strftime('%H:%M:%S')}")
if __name__ == "__main__":
setup()
Bước 3: Thực thi Notebook trên Colab
Tạo 3 cells trong Notebook vừa tạo để mount Google Drive và chạy server:
Cell 1: Mount Drive & Setup Environment
Script này giúp lưu model vào Drive, tránh việc phải tải lại 12GB model mỗi lần chạy.
from google.colab import drive
from google.colab import userdata
import os, sys
print("1. Mounting Drive...")
drive.mount('/content/drive')
path = '/content/drive/MyDrive/ollama-collab'
lib_path = os.path.join(path, 'lib')
model_path = os.path.join(path, 'ollama_models')
os.makedirs(lib_path, exist_ok=True)
os.makedirs(model_path, exist_ok=True)
print("2. Linking Models...")
!mkdir -p ~/.ollama
!ln -sfn {model_path} ~/.ollama/models # Model sẽ persist trên Drive!
if lib_path not in sys.path:
sys.path.insert(0, lib_path)
%cd {path}
Cell 2: Install Requirements
print("3. Installing Requirements...")
with open('requirements.txt', 'w') as f:
f.write("python-dotenv \n requests")
if not os.path.exists(os.path.join(os.getcwd(), 'lib/requests')):
!pip install --target={os.getcwd()}/lib -r requirements.txt
else:
print("✅ Libraries found.")
Cell 3: Start Server
Cell này sẽ lấy token từ Secrets và khởi chạy script server_app.py.
print("4. Starting Server...")
# Get Secrets securely
try:
ngrok_token = userdata.get('NGROK_TOKEN')
ollama_pass = userdata.get('OLLAMA_PASS')
except:
ngrok_token = "YOUR_TOKEN_HERE"
ollama_pass = "YOUR_PASSWORD"
print("⚠️ Secrets not found. Using fallback.")
os.environ['NGROK_TOKEN'] = ngrok_token
os.environ['OLLAMA_USER'] = 'admin'
os.environ['OLLAMA_PASS'] = ollama_pass
!python server_app.py
Bước 4: Thiết lập Local Proxy cho VSCode
Hiện tại, Extension VSCode Continue không hỗ trợ Basic Auth trực tiếp khi kết nối với Ollama. Chúng ta cần một script Python trung gian (Proxy) để xử lý việc xác thực này.
4.1. Cài đặt thư viện cần thiết:
pip install flask requests
4.2. Tạo file vscode_proxy.py:
Lưu file này trên máy tính của bạn.
from flask import Flask, request, Response, stream_with_context
import requests
import os
import json
app = Flask(__name__)
# --- CONFIGURATION ---
# Thay bằng URL Ngrok từ Colab output
REMOTE_URL = os.getenv("OLLAMA_HOST", "https://your-ngrok-url.ngrok-free.app")
OLLAMA_USER = os.getenv("OLLAMA_USERNAME", "admin")
OLLAMA_PASS = os.getenv("OLLAMA_PASSWORD", "your-hashed-password-here")
# Headers để bypass ngrok browser warning
HEADERS = {
"ngrok-skip-browser-warning": "true",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
AUTH = (OLLAMA_USER, OLLAMA_PASS)
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def proxy(path):
url = f"{REMOTE_URL}/{path}"
method = request.method
params = request.args
print(f"DEBUG: Proxying {method} to {url}")
try:
# Parse và modify request payload
payload = request.get_json(force=True, silent=True) or {}
# LOGGING: Ghi log request để debug
with open("vscode_requests.log", "a", encoding="utf-8") as log_file:
log_file.write(f"\n--- REQUEST ({method}) ---\n")
log_file.write(json.dumps(payload, indent=2))
log_file.write("\n-------------------------\n")
# FORCE MODEL: Luôn dùng gpt-oss:20b
print(f"🛠️ Forcing Model: gpt-oss:20b")
payload["model"] = "gpt-oss:20b"
# CONTEXT INJECTION: Tối ưu memory
if "options" not in payload:
payload["options"] = {}
payload["options"]["num_ctx"] = 2048 # Context window
payload["options"]["num_predict"] = -1 # Unlimited generation
payload["num_ctx"] = 8192 # Fallback top-level
# Forward request với authentication
resp = requests.request(
method=method,
url=url,
headers=HEADERS,
json=payload,
params=params,
auth=AUTH,
stream=True,
timeout=300
)
# Loại bỏ hop-by-hop headers
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items()
if name.lower() not in excluded_headers]
return Response(
stream_with_context(resp.iter_content(chunk_size=1024)),
status=resp.status_code,
headers=headers
)
except Exception as e:
print(f"ERROR: {e}")
return Response(json.dumps({"error": str(e)}), status=500)
if __name__ == '__main__':
print("🚀 VS Code → Ollama Proxy Running")
print(f"Targeting: {REMOTE_URL}")
print("━" * 50)
print("📝 Trong VSCode Continue, set API Base URL:")
print(" http://localhost:11435")
print("━" * 50)
app.run(port=11435, threaded=True)
4.3. Kích hoạt Proxy:
Sau khi Colab khởi chạy thành công và cung cấp URL Ngrok, bạn chạy lệnh sau trên terminal máy local:
# Set environment variables (Lấy từ output của Colab)
$env:OLLAMA_HOST="https://your-ngrok-url.ngrok-free.app"
$env:OLLAMA_USERNAME="admin"
$env:OLLAMA_PASSWORD="your-hashed-password-from-colab"
# Chạy proxy
python vscode_proxy.py
Bước 5: Cấu hình VSCode Continue Extension
Bước cuối cùng là kết nối VSCode với Proxy local vừa tạo (chạy trên port 11435).
- Cài đặt extension Continue từ VSCode Marketplace.
- Mở file cấu hình
~/.continue/config.yamlhoặc vào Settings. - Thêm cấu hình sau:
- name: Remote Ollama (20B)
provider: ollama
model: gpt-oss:20b
apiBase: http://localhost:11435
roles:
- chat
- edit
- apply
Restart VSCode, chọn model Remote Ollama (20B) và trải nghiệm.
Một vài tip hay:
Tối ưu hóa bộ nhớ:
Luôn sử dụng lệnh symbolic link (ln -sfn) để trỏ folder models vào Google Drive. Điều này giúp bạn không phải tải lại model nặng hàng chục GB mỗi khi phiên làm việc Colab kết thúc.Bảo mật kết nối:
Thường xuyên kiểm tra tab Traffic-inspector trên Ngrok dashboard. Nếu phát hiện IP lạ cố gắng kết nối, hãy terminate session ngay lập tức. Luôn tắt Notebook khi không sử dụng để bảo vệ tài khoản Google và Ngrok.
Câu hỏi thường gặp
Tại sao phải dùng script Proxy local thay vì kết nối thẳng vào Ngrok?
VSCode Continue Extension hiện chưa hỗ trợ tính năng Basic Authentication khi kết nối với Ollama. Proxy local đóng vai trò như một "adapter", bổ sung thông tin đăng nhập vào header trước khi gửi request đến server Colab.
Tôi có thể sử dụng giải pháp này cho dự án công ty không?
Bạn nên cân nhắc kỹ. Mặc dù dữ liệu được truyền qua đường hầm (tunnel) bảo mật và có mật khẩu, nhưng việc đưa code lên cloud miễn phí (qua Google Colab và Ngrok) vẫn tiềm ẩn rủi ro về privacy so với chạy hoàn toàn local (air-gapped). Không nên dùng cho các dự án có tính bảo mật cực cao (NDA).
Thời gian hoạt động của Colab là bao lâu?
Phiên làm việc miễn phí của Colab thường kéo dài tối đa 12 tiếng, nhưng có thể bị ngắt kết nối sớm hơn nếu bạn không tương tác (idle) hoặc sử dụng quá nhiều tài nguyên GPU. Nếu bị ngắt, bạn chỉ cần chạy lại Runtime.

Top comments (0)