В этом руководстве мы покажем, как можно объединить 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.