В этом руководстве мы покажем, как можно объединить MLE-Agent с Ollama для создания полностью локального рабочего процесса машинного обучения без использования API. Мы настроим воспроизводимую среду в Google Colab, сгенерируем небольшой синтетический набор данных и затем заставим агента составить черновик скрипта для обучения.
Настройка среды
Мы определяем вспомогательную функцию `sh`, которую используем для запуска команд оболочки. Мы выводим команду, захватываем её вывод и выдаём ошибку, если она не удаётся, чтобы можно было отслеживать выполнение в режиме реального времени.
«`python
import os, re, time, textwrap, subprocess, sys
from pathlib import Path
def sh(cmd, check=True, env=None, cwd=None):
print(f»$ {cmd}»)
p = subprocess.run(cmd, shell=True, env={os.environ, (env or {})} if env else None,
cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
print(p.stdout)
if check and p.returncode!=0: raise RuntimeError(p.stdout)
return p.stdout
«`
Установка зависимостей
Мы устанавливаем необходимые зависимости Python:
«`python
sh(«pip -q install —upgrade pip»)
sh(«pip -q install mle-agent==0.4.* scikit-learn pandas numpy joblib»)
sh(«curl -fsSL https://ollama.com/install.sh | sh»)
sv = subprocess.Popen(«ollama serve», shell=True)
time.sleep(4); sh(f»ollama pull {MODEL_NAME}»)
«`
Генерация данных и настройка параметров
Мы генерируем небольшой помеченный набор данных и задаём переменные среды, чтобы управлять MLE-Agent через Ollama локально. Мы составляем строгий запрос для `train.py` и определяем вспомогательную функцию `extract`, которая извлекает только защищённый код Python. Затем мы просим MLE-Agent (при необходимости используя `ollama run`) и сохраняем необработанный сгенерированный скрипт на диск для очистки.
«`python
np.random.seed(0)
n=500; X=np.random.rand(n,4); y=(X@np.array([0.4,-0.2,0.1,0.5])+0.15*np.random.randn(n)>0.55).astype(int)
pd.DataFrame(np.c[X,y], columns=[«f1″,»f2″,»f3″,»f4″,»target»]).tocsv(DATA, index=False)
env = {«OPENAIAPIKEY»:»», «ANTHROPICAPIKEY»:»», «GEMINIAPIKEY»:»»,
«OLLAMAHOST»:»http://127.0.0.1:11434″, «MLELLMENGINE»:»ollama»,»MLEMODEL»:MODEL_NAME}
prompt=f»»»Return ONE fenced python code block only.
Write train.py that reads {DATA}; 80/20 split (random_state=42, stratify);
Pipeline: SimpleImputer + StandardScaler + LogisticRegression(classweight=’balanced’, maxiter=1000, random_state=42);
Print ROC-AUC & F1; print sorted coefficient magnitudes; save model to {MODEL} and preds to {PREDS};
Use only sklearn, pandas, numpy, joblib; no extra text.»»»
«`
Очистка и подготовка скрипта
Мы очищаем сгенерированный агентом скрипт, удаляя посторонние префиксы и исправляя распространённые ошибки при импорте scikit-learn, а затем добавляем отсутствующие необходимые импорты, чтобы скрипт работал корректно.
«`python
def sanitize(src:str)->str:
if not src: return «»
s = src
s = re.sub(r»r»,»»,s)
s = re.sub(r»^pythonb»,»»,s.strip(), flags=re.I).strip()
fixes = {
r»froms+sklearn.pipelines+imports+SimpleImputer»: «from sklearn.impute import SimpleImputer»,
r»froms+sklearn.preprocessings+imports+SimpleImputer»: «from sklearn.impute import SimpleImputer»,
r»froms+sklearn.pipelines+imports+StandardScaler»: «from sklearn.preprocessing import StandardScaler»,
r»froms+sklearn.preprocessings+imports+ColumnTransformer»: «from sklearn.compose import ColumnTransformer»,
r»froms+sklearn.pipelines+imports+ColumnTransformer»: «from sklearn.compose import ColumnTransformer»,
}
for pat,rep in fixes.items(): s = re.sub(pat, rep, s)
if «SimpleImputer» in s and «from sklearn.impute import SimpleImputer» not in s:
s = «from sklearn.impute import SimpleImputern»+s
if «StandardScaler» in s and «from sklearn.preprocessing import StandardScaler» not in s:
s = «from sklearn.preprocessing import StandardScalern»+s
if «ColumnTransformer» in s and «from sklearn.compose import ColumnTransformer» not in s:
s = «from sklearn.compose import ColumnTransformern»+s
if «traintestsplit» in s and «from sklearn.modelselection import traintest_split» not in s:
s = «from sklearn.modelselection import traintest_splitn»+s
if «joblib» in s and «import joblib» not in s: s = «import joblibn»+s
return s
«`
Выполнение скрипта
Мы решаем, запускать ли очищенный код агента или вернуться к безопасному скрипту, затем сохраняем оба варианта для справки. Мы выполняем выбранный `train.py`, выводим предварительный просмотр его содержимого и перечисляем все сгенерированные артефакты, чтобы подтвердить успешное завершение рабочего процесса.
«`python
chosen = san if («import » in san and «sklearn» in san and «read_csv» in san) else safe
Path(SAFE).write_text(safe, encoding=»utf-8″)
Path(FINAL).write_text(chosen, encoding=»utf-8″)
print(«n=== Using train.py (first 800 chars) ===n», chosen[:800], «n…»)
sh(f»python {FINAL}»)
print(«nArtifacts:», [str(p) for p in WORK.glob(‘*’)])
print(» Done — outputs in», WORK)
«`
Через этот процесс мы демонстрируем, как можно интегрировать локальные LLM с традиционными конвейерами машинного обучения, сохраняя надёжность и безопасность. Результат — практическая основа, которая позволяет нам контролировать выполнение, избегать внешних ключей и при этом использовать автоматизацию для обучения моделей в реальных условиях.
1. Какие инструменты и библиотеки используются для создания локального конвейера машинного обучения в статье?
В статье используются MLE-Agent, Ollama, Google Colab, Python с библиотеками scikit-learn, pandas, numpy, joblib.
2. Какие шаги необходимо выполнить для генерации синтетического набора данных и настройки параметров в MLE-Agent?
Для генерации синтетического набора данных в статье используется код на Python для создания случайных данных и сохранения их в CSV-файл. Затем задаются переменные среды для управления MLE-Agent через Ollama локально.
3. Какие функции и методы используются для очистки и подготовки скрипта, сгенерированного MLE-Agent?
В статье используется функция sanitize() для очистки сгенерированного агентом скрипта. Она удаляет посторонние префиксы, исправляет распространённые ошибки при импорте scikit-learn и добавляет отсутствующие необходимые импорты.
4. Какие преимущества даёт использование локальных LLM (Large Language Models) в конвейерах машинного обучения?
Использование локальных LLM в конвейерах машинного обучения позволяет интегрировать их с традиционными конвейерами, сохраняя надёжность и безопасность. Это также позволяет контролировать выполнение, избегать внешних ключей и использовать автоматизацию для обучения моделей в реальных условиях.
5. Какие переменные среды задаются для управления MLE-Agent через Ollama локально?
Для управления MLE-Agent через Ollama локально задаются следующие переменные среды: OPENAIAPIKEY, ANTHROPICAPIKEY, GEMINIAPIKEY, OLLAMAHOST, MLELLMENGINE, MLEMODEL.