В этом руководстве мы реализуем полнофункциональную среду Ollama внутри Google Colab для воспроизведения рабочего процесса LLM на собственном оборудовании.
Установка Ollama в Google Colab
1. Устанавливаем Ollama непосредственно на виртуальную машину Colab с помощью официального установщика Linux.
2. Запускаем сервер Ollama в фоновом режиме, чтобы открыть HTTP API на `localhost:11434`.
3. Проверяем службу.
4. Загружаем лёгкие модели, такие как `qwen2.5:0.5b-instruct` или `llama3.2:1b`, которые балансируют ограничения ресурсов с удобством использования в среде только с процессором.
Взаимодействие с моделями
Для взаимодействия с этими моделями программно мы используем конечную точку `/api/chat` через модуль `requests` Python с включённым потоковым режимом, что позволяет захватывать вывод на уровне токенов постепенно.
Создание пользовательского интерфейса с помощью Gradio
Мы накладываем пользовательский интерфейс на основе Gradio поверх этого клиента, чтобы мы могли выдавать запросы, поддерживать многооборотную историю, настраивать параметры, такие как температура и размер контекста, и просматривать результаты в режиме реального времени.
Код
«`python
import os, sys, subprocess, time, json, requests, textwrap
from pathlib import Path
def sh(cmd, check=True):
«»»Run a shell command, stream output.»»»
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for line in p.stdout:
print(line, end=»»)
p.wait()
if check and p.returncode != 0:
raise RuntimeError(f»Command failed: {cmd}»)
if not Path(«/usr/local/bin/ollama»).exists() and not Path(«/usr/bin/ollama»).exists():
print(» Installing Ollama …»)
sh(«curl -fsSL https://ollama.com/install.sh | sh»)
else:
print(» Ollama already installed.»)
try:
import gradio
except Exception:
print(» Installing Gradio …»)
sh(«pip -q install gradio==4.44.0»)
«`
Запуск сервера Ollama
«`python
def start_ollama():
try:
requests.get(«http://127.0.0.1:11434/api/tags», timeout=1)
print(» Ollama server already running.»)
return None
except Exception:
pass
print(» Starting Ollama server …»)
proc = subprocess.Popen([«ollama», «serve»], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for _ in range(60):
time.sleep(1)
try:
r = requests.get(«http://127.0.0.1:11434/api/tags», timeout=1)
if r.ok:
print(» Ollama server is up.»)
break
except Exception:
pass
else:
raise RuntimeError(«Ollama did not start in time.»)
return proc
serverproc = startollama()
«`
Определение модели
«`python
MODEL = os.environ.get(«OLLAMA_MODEL», «qwen2.5:0.5b-instruct»)
print(f» Using model: {MODEL}»)
try:
tags = requests.get(«http://127.0.0.1:11434/api/tags», timeout=5).json()
have = any(m.get(«name»)==MODEL for m in tags.get(«models», []))
except Exception:
have = False
if not have:
print(f» Pulling model {MODEL} (first time only) …»)
sh(f»ollama pull {MODEL}»)
«`
Создание клиента для потоковой передачи
«`python
OLLAMA_URL = «http://127.0.0.1:11434/api/chat»
def ollamachatstream(messages, model=MODEL, temperature=0.2, num_ctx=None):
«»»Yield streaming text chunks from Ollama /api/chat.»»»
payload = {
«model»: model,
«messages»: messages,
«stream»: True,
«options»: {«temperature»: float(temperature)}
}
if num_ctx:
payload[«options»][«numctx»] = int(numctx)
with requests.post(OLLAMA_URL, json=payload, stream=True) as r:
r.raiseforstatus()
for line in r.iter_lines():
if not line:
continue
data = json.loads(line.decode(«utf-8»))
if «message» in data and «content» in data[«message»]:
yield data[«message»][«content»]
if data.get(«done»):
break
«`
Запуск теста
«`python
def smoke_test():
print(«n Smoke test:»)
sys_msg = {«role»:»system»,»content»:»You are concise. Use short bullets.»}
user_msg = {«role»:»user»,»content»:»Give 3 quick tips to sleep better.»}
out = []
for chunk in ollamachatstream([sysmsg, usermsg], temperature=0.3):
print(chunk, end=»»)
out.append(chunk)
print(«n Done.n»)
try:
smoke_test()
except Exception as e:
print(» Smoke test skipped:», e)
«`
Интеграция Gradio
«`python
import gradio as gr
SYSTEM_PROMPT = «You are a helpful, crisp assistant. Prefer bullets when helpful.»
def chatfn(message, history, temperature, numctx):
msgs = [{«role»:»system»,»content»:SYSTEM_PROMPT}]
for u, a in history:
if u: msgs.append({«role»:»user»,»content»:u})
if a: msgs.append({«role»:»assistant»,»content»:a})
msgs.append({«role»:»user»,»content»: message})
acc = «»
try:
for part in ollamachatstream(msgs, model=MODEL, temperature=temperature, numctx=numctx or None):
acc += part
yield acc
except Exception as e:
yield f» Error: {e}»
with gr.Blocks(title=»Ollama Chat (Colab)», fill_height=True) as demo:
gr.Markdown(«# Ollama Chat (Colab)nSmall local-ish LLM via Ollama + Gradio.n»)
with gr.Row():
temp = gr.Slider(0.0, 1.0, value=0.3, step=0.1, label=»Temperature»)
numctx = gr.Slider(512, 8192, value=2048, step=256, label=»Context Tokens (numctx)»)
chat = gr.Chatbot(height=460)
msg = gr.Textbox(label=»Your message», placeholder=»Ask anything…», lines=3)
clear = gr.Button(«Clear»)
def user_send(m, h):
m = (m or «»).strip()
if not m: return «», h
return «», h + [[m, None]]
def botreply(h, temperature, numctx):
u = h[-1][0]
stream = chatfn(u, h[:-1], temperature, int(numctx))
acc = «»
for partial in stream:
acc = partial
h[-1][1] = acc
yield h
msg.submit(user_send, [msg, chat], [msg, chat])
.then(botreply, [chat, temp, numctx], [chat])
clear.click(lambda: None, None, chat)
print(» Launching Gradio …»)
demo.launch(share=True)
«`
В заключение мы создаём воспроизводимый конвейер для запуска Ollama в Colab: установка, запуск сервера, управление моделями, доступ к API и интеграция пользовательского интерфейса. Система использует REST API Ollama в качестве основного уровня взаимодействия, обеспечивая как командную строку, так и потоковый доступ Python, в то время как Gradio обрабатывает сохранение сеансов и рендеринг чата.
1. Какие шаги включает в себя установка Ollama в Google Colab?
Ответ: установка Ollama в Google Colab включает в себя следующие шаги:
1. Установка Ollama непосредственно на виртуальную машину Colab с помощью официального установщика Linux.
2. Запуск сервера Ollama в фоновом режиме, чтобы открыть HTTP API на `localhost:11434`.
3. Проверка службы.
4. Загрузка лёгких моделей, таких как `qwen2.5:0.5b-instruct` или `llama3.2:1b`.
2. Как осуществляется взаимодействие с моделями в данном руководстве?
Ответ: для взаимодействия с моделями программно используется конечная точка `/api/chat` через модуль `requests` Python с включённым потоковым режимом. Это позволяет захватывать вывод на уровне токенов постепенно.
3. Какие компоненты используются для создания пользовательского интерфейса в этом руководстве?
Ответ: для создания пользовательского интерфейса используется библиотека Gradio. Она накладывается поверх клиента, чтобы можно было выдавать запросы, поддерживать многооборотную историю, настраивать параметры, такие как температура и размер контекста, и просматривать результаты в режиме реального времени.
4. Какие функции выполняет код, представленный в разделе «Код»?
Ответ: код в разделе «Код» выполняет следующие функции:
* Установка Ollama, если она ещё не установлена.
* Запуск сервера Ollama.
* Определение модели для работы.
* Создание клиента для потоковой передачи.
* Запуск теста для проверки работоспособности системы.
5. Какие параметры можно настроить при использовании Gradio для взаимодействия с моделью?
Ответ: при использовании Gradio можно настроить следующие параметры:
* Температура (temperature).
* Размер контекста (num_ctx).