Python, виртуальные окружения и Jupyter
Ставим Python на компьютер, заводим для курса отдельную «коробку» с библиотеками (виртуальное окружение), запускаем Jupyter и VS Code и на простой арифметике прикидываем, когда понадобится видеокарта.
Зачем это нужно
Заголовок раздела «Зачем это нужно»Python — язык почти всего ML. Но сам по себе Python умеет немного: силу ему дают библиотеки (их ещё называют
пакетами) — готовые наборы чужого кода, которые подключают к своей программе. NumPy быстро считает с таблицами чисел,
PyTorch обучает нейросети, matplotlib рисует графики. Библиотеки скачивают из интернета одной командой pip install имя
(pip — программа-установщик, которая идёт вместе с Python).
У библиотек есть версии: авторы постоянно их обновляют, и в новой версии что-то может работать иначе. Отсюда проблема, которая рано или поздно ломает каждому вечер: конфликт версий. Одному проекту нужен PyTorch версии 2.4, другому — 2.8. Если ставить всё «в систему», один на весь компьютер, второй проект ломает первый, а через полгода вы уже не можете запустить собственный код.
Решение — виртуальное окружениевиртуальное окружениеEN virtual environment (venv)Отдельная папка со своим Python и своими библиотеками для одного проекта.: отдельная папка со своим Python и своими библиотеками на каждый проект. Как отдельная коробка с инструментами для каждой работы: что положили в одну, не мешает другой. В этом уроке мы поставим Python, создадим окружение для курса, запустим Jupyter и разберёмся с вопросом, который волнует всех: где взять видеокарту и когда она действительно понадобится.
Какой Python ставить
Заголовок раздела «Какой Python ставить»Нужен Python 3.11 или 3.12. Курс проверяется на 3.11. Более новые версии обычно тоже работают, но поддержка свежего Python в PyTorch иногда появляется с задержкой. Проверьте, что уже стоит:
python3 --versionРаботайте внутри WSL (см. прошлый урок). В Ubuntu 24.04 уже есть Python 3.12, нужно доставить модуль venv:
sudo apt update && sudo apt install python3-venv python3-pipВ Ubuntu 22.04 системный Python — 3.10. Поставьте новый через uv (ниже), это проще всего.
Системный python3 от Apple обычно устаревший (ниже 3.11). Поставьте свежий Python через uv (ниже) или Homebrew:
brew install python@3.12Используйте пакет дистрибутива, если версия ≥ 3.11, иначе поставьте нужную версию через uv.
Как устроено виртуальное окружение
Заголовок раздела «Как устроено виртуальное окружение»Окружение — это обычная папка (по традиции .venv) внутри проекта. В ней лежат ссылка на интерпретатор Python
и своя папка site-packages, куда pip ставит библиотеки.
flowchart TB SYS["Python 3.12 в системе"] SYS --> A[".venv проекта ChinaAI<br/>numpy 2.x, torch, pytest"] SYS --> B[".venv старого проекта<br/>numpy 1.x, torch 2.1"] SYS --> C[".venv бота<br/>aiogram, httpx"]
Активация — это не магия. Скрипт activate ставит папку .venv/bin в начало переменной PATH
(помните её из прошлого урока?). После этого команды python и pip находятся сначала в окружении.
cd ChinaAIpython3 -m venv .venv # создать окружение в папке .venv (-m: запустить модуль venv как программу)source .venv/bin/activate # выполнить скрипт активации в текущем терминале (в Windows без WSL: .venv\Scripts\activate)which python # → /home/ivan/ChinaAI/.venv/bin/pythonpython -c "import sys; print(sys.prefix != sys.base_prefix)" # -c: выполнить код из строки → True: мы в окруженииdeactivate # выйтиПосле активации в начале строки терминала появляется (.venv). Активировать нужно в каждом новом окне
терминала: окружение живёт в пределах сеанса.
uv — тот же pip, только быстрее
Заголовок раздела «uv — тот же pip, только быстрее»менеджер пакетовменеджер пакетовEN package managerpip, uv, conda — устанавливают библиотеки вместе с их зависимостями. pip идёт вместе с Python. Ему есть современная замена — uv: он написан на Rust,
ставит пакеты в разы быстрее и умеет сам скачивать нужную версию Python. Именно uv использует в своих
заданиях Stanford CS336, один из лучших курсов по LLM.
curl -LsSf https://astral.sh/uv/install.sh | sh # установка (macOS, Linux, WSL): curl скачивает скрипт, | sh сразу его выполняет# или, если pip уже есть: pip install uv
uv venv --python 3.12 # создать .venv; скачает Python 3.12, если его нетsource .venv/bin/activateuv pip install -r homework/requirements.txt # тот же интерфейс, что у pippip + venv | uv | |
|---|---|---|
| Где взять | идёт с Python | ставится одной командой |
| Скорость установки | обычная | в разы быстрее |
| Ставит сам Python | нет | да: uv python install 3.12 |
| Команды | python -m venv, pip install | uv venv, uv pip install |
Выбирайте любой вариант. Все команды курса пишутся для pip, и в uv они работают с префиксом uv.
Зависимости курса
Заголовок раздела «Зависимости курса»Список библиотек проекта хранится в текстовом файле requirements.txt. В курсе он лежит в homework/requirements.txt:
numpy>=1.26pytest>=8pyyaml>=6matplotlib>=3.8torch>=2.4# Табличный ML (модуль 2.4, ДЗ s2-hw02)pandas>=2.2scikit-learn>=1.4lightgbm>=4.0Строки, начинающиеся с #, — комментарии, pip их пропускает. Запись numpy>=1.26 значит «любая версия не ниже 1.26». Чтобы зафиксировать точные версии того, что стоит
у вас сейчас, есть pip freeze > requirements.lock.txt. Так делают, когда важна полная воспроизводимость.
- Склонируйте курс и зайдите в папку:
git clone https://github.com/samnolak/ChinaAI.git && cd ChinaAI. - Создайте и активируйте окружение:
python3 -m venv .venv && source .venv/bin/activate. - Сначала поставьте PyTorch без CUDA. CUDACUDAEN CUDA (Compute Unified Device Architecture)Платформа NVIDIA для вычислений на видеокартах. В PyTorch видеокарта NVIDIA — это устройство
"cuda"("cuda:0","cuda:1"…). — платформа NVIDIA, через которую PyTorch считает на видеокарте (урок 0.0.2). Сборка без неё весит в разы меньше полной, а на ступенях 0–3 GPU не нужен:pip install torch --index-url https://download.pytorch.org/whl/cpu. - Остальное:
pip install -r homework/requirements.txt. Уже стоящий torch pip не тронет. - Jupyter:
pip install jupyterlab ipykernel. - Проверьте окружение скриптом из следующего раздела.
Дополнительный файл homework/requirements-llm.txt (transformers, datasets, peft, trl, accelerate) понадобится
на ступенях 6–8. Ставить его сейчас не нужно.
Проверяем окружение
Заголовок раздела «Проверяем окружение»Сохраните этот скрипт как check_env.py и запустите python check_env.py:
"""Проверка окружения курса ChinaAI: python check_env.py"""import platformimport sys
# 1. Версия Python и путь к интерпретатору, который сейчас работаетprint(f"Python {platform.python_version()} ({sys.executable})")assert sys.version_info >= (3, 11), "Нужен Python 3.11 или новее"
# 2. Активно ли виртуальное окружение: внутри venv sys.prefix указывает на папку .venvin_venv = sys.prefix != sys.base_prefixprint(f"venv {'да' if in_venv else 'НЕТ — активируйте окружение!'}")
# 3. NumPy — если не установлен, здесь будет ModuleNotFoundErrorimport numpy as npprint(f"NumPy {np.__version__}")
# 4. PyTorch и устройство: cuda (NVIDIA), mps (Mac на Apple Silicon) или cputry: import torch cuda = torch.cuda.is_available() mps = getattr(torch.backends, "mps", None) is not None and torch.backends.mps.is_available() device = "cuda" if cuda else "mps" if mps else "cpu" print(f"PyTorch {torch.__version__} устройство: {device}") x = torch.randn(256, 256, device=device) # случайная матрица 256×256 на этом устройстве print(f"тест (x @ x.T).shape = {tuple((x @ x.T).shape)}")except ImportError: print("PyTorch не установлен — до ступени 3 он не нужен")Вывод на машине автора (версии и пути у вас будут свои):
Python 3.11.15 (/home/user/.venvs/cai/bin/python)venv даNumPy 2.4.6PyTorch 2.14.1+cu130 устройство: cpuтест (x @ x.T).shape = (256, 256)Суффикс версии подсказывает, какая это сборка: +cpu — без CUDA, +cu130 — с CUDA 13.0. У автора стоит CUDA-сборка,
но видеокарты в машине нет, поэтому устройство — cpu. На вашей машине с CUDA-сборкой будет cuda. Устройство mps
означает GPU в Mac на Apple Silicon.
Если что-то пошло не так, сверьтесь с таблицей. Почти все ошибки на этом шаге — из-за того, что окружение не активировано:
| Что видите | Почему | Что делать |
|---|---|---|
python: command not found | в системе есть только python3 | пишите python3. Внутри активированного .venv работает и python |
ensurepip is not available при создании venv | в Ubuntu не установлен модуль venv | sudo apt install python3-venv и создайте окружение заново |
ModuleNotFoundError: No module named 'numpy' | окружение не активировано или пакет не установлен | source .venv/bin/activate, затем pip install -r homework/requirements.txt |
error: externally-managed-environment | pip пытается ставить пакет в системный Python | активируйте .venv и повторите |
в Jupyter ModuleNotFoundError, хотя в терминале всё работает | ноутбук работает в другом ядре | выберите ядро «Python (ChinaAI)» (см. ниже) или выполните в ячейке %pip install … |
Jupyter Lab: код, текст и графики в одном документе
Заголовок раздела «Jupyter Lab: код, текст и графики в одном документе»Jupyter-ноутбукJupyter-ноутбукEN Jupyter notebookДокумент из ячеек с кодом, текстом и графиками (.ipynb). Состояние живёт в ядре, пока оно запущено. состоит из ячеек. В ячейке может быть код или текст, а под ячейкой с кодом сразу появляется результат: число, таблица, график. Для исследования данных и экспериментов это удобнее скрипта.
jupyter lab # откроется браузер с адресом вида http://localhost:8888/lab?token=...Если Jupyter стоит не в окружении курса, зарегистрируйте окружение как отдельное ядро (kernel):
python -m ipykernel install --user --name chinaai --display-name "Python (ChinaAI)"Теперь в Jupyter можно выбрать ядро «Python (ChinaAI)».
Главное, что нужно знать:
- Shift+Enter выполняет ячейку и переходит к следующей.
- Ядро — это работающий процесс Python. Переменные живут в нём, пока его не перезапустят.
%timeit выражениезамеряет время,%pip install пакетставит пакет именно в окружение ядра. Не путайте с!pip: восклицательный знак запускает pip из системногоPATH, и пакет может уйти не туда.
VS Code
Заголовок раздела «VS Code»Для домашних работ (обычные .py файлы и тесты) удобнее редактор. Мы рекомендуем VS Code:
- Поставьте расширения Python и Jupyter от Microsoft, а в Windows ещё и WSL.
- Откройте папку
ChinaAI(File → Open Folder, а из WSL простоcode .). - Ctrl+Shift+P → «Python: Select Interpreter» → выберите
.venv. Встроенный терминал VS Code будет активировать окружение сам. - Файлы
.ipynbоткрываются прямо в VS Code, отдельный Jupyter Lab не обязателен.
Где взять GPU
Заголовок раздела «Где взять GPU»графический процессорграфический процессор (GPU, видеокарта)EN graphics processing unit (GPU)Тысячи простых вычислительных ядер. Идеально подходит для матричных умножений, поэтому на GPU обучают нейросети. — это тысячи простых ядер, которые параллельно перемножают матрицы. Нейросеть — это почти сплошь матричные умножения, поэтому разница огромная. Процессор 4-ядерной машины, на которой писался курс, на умножении больших матриц в NumPy показал 80–160 GFLOPS (миллиардов операций с плавающей точкой в секунду), то есть около 0.1 TFLOPS (T — тера, триллион: 1 TFLOPS = 1000 GFLOPS). Одна игровая видеокарта последних поколений выдаёт по паспорту десятки TFLOPS: разница в сотни раз.
🖥 На вашей машине (4×GPU)
Заголовок раздела «🖥 На вашей машине (4×GPU)»У вас 4× RTX 4080 по 32 ГБ и 48-ядерный EPYC — весь курс можно пройти без облаков. Подробная настройка драйвера, сборки PyTorch с CUDA и проверка связи между картами — на странице «Ваша лаборатория (4×GPU)». Сейчас, на ступени 0, достаточно убедиться, что карты видны:
nvidia-smi # таблица: 4 видеокарты, объём памяти каждой, загрузка и температураpython -c "import torch; print(torch.cuda.is_available(), torch.cuda.device_count())"Ожидаемый вывод второй команды — True 4. Если видите False 0, у вас CPU-сборка PyTorch (как в шагах выше)
или не установлен драйвер NVIDIA (тогда и nvidia-smi не сработает). CPU-сборка — это нормально до ступени 4. Сборку с CUDA можно поставить сразу или позже, по инструкции на странице лаборатории.
Узнайте, сколько реально выдаёт ваше железо. Сохраните скрипт как bench_flops.py и запустите:
"""Сколько GFLOPS выдаёт ваша машина на умножении матриц: python bench_flops.py"""import time
import numpy as np
n = 2048flop = 2 * n**3 # умножение n×n на n×n: n³ умножений и столько же сложений
A = np.random.default_rng(0).standard_normal((n, n), dtype=np.float32)A @ A # прогрев: первый запуск всегда медленнееt0 = time.perf_counter()for _ in range(5): A @ Adt = (time.perf_counter() - t0) / 5 # среднее время одного умножения, секундыprint(f"CPU (NumPy, float32): {flop / dt / 1e9:8.0f} GFLOPS")
try: import torch if torch.cuda.is_available(): for i in range(torch.cuda.device_count()): # по очереди каждая видеокарта X = torch.randn(8192, 8192, device=f"cuda:{i}", dtype=torch.bfloat16) X @ X # прогрев torch.cuda.synchronize(i) # дождаться, пока GPU закончит t0 = time.perf_counter() for _ in range(20): X @ X torch.cuda.synchronize(i) dt = (time.perf_counter() - t0) / 20 print(f"GPU {i} ({torch.cuda.get_device_name(i)}, bf16): {2 * 8192**3 / dt / 1e12:6.1f} TFLOPS") else: print("GPU с CUDA не найден")except ImportError: print("PyTorch не установлен")На машине автора (4 ядра, без видеокарты):
CPU (NumPy, float32): 122 GFLOPSGPU с CUDA не найденУ вас цифры будут намного больше: и для процессора, и тем более для каждой видеокарты. Запишите свои цифры в журнал (папка journal/ в репозитории курса):
ниже они понадобятся для расчёта, а на ступени 5 — для сравнения с дата-центровыми GPU. Команда
torch.cuda.synchronize нужна потому, что GPU работает асинхронно: Python отдаёт ему задание и сразу идёт дальше,
а без синхронизации вы измерили бы время отправки команды, а не вычисления.
Если своей видеокарты под рукой нет
Заголовок раздела «Если своей видеокарты под рукой нет»Варианты для тех, кто учится из России (например, в поездке или на другом компьютере):
| Вариант | Плюсы | Минусы |
|---|---|---|
| Mac на Apple Silicon | PyTorch работает через mps | Не всё из экосистемы CUDA доступно |
| Yandex DataSphere | Ноутбуки с GPU, оплата в рублях | Платно, следите за временем работы |
| Российские GPU-облака (Selectel, Cloud.ru и др.) | Почасовая аренда сервера с GPU | Нужно уметь работать в терминале — вы уже умеете |
| Kaggle Notebooks | Бесплатная квота GPU (на момент написания около 30 часов в неделю) | Для GPU нужно подтвердить номер телефона. С российскими номерами бывают проблемы |
| Google Colab | Бесплатный GPU T4 | Лимиты плавают, платный план российской картой не оплатить, бывают сложности с регистрацией |
Почему первые ступени идут на CPU
Заголовок раздела «Почему первые ступени идут на CPU»Сколько вычислений нужно на обучение? Есть грубое, но удивительно точное правило (подробно — в уроке 5.1.1 о законах масштабирования):
Словами: число операций ≈ 6 × число параметров модели × число токенов, на которых она учится. Здесь — сколько операций нужно (FLOP — одна операция с дробными числами: умножение или сложение), — сколько чисел-весов в модели (параметров, урок 0.0.1), — сколько токенов (или примеров) она «прочитает» за обучение. Множитель 6 складывается так: примерно 2 операции на параметр, когда модель считает ответ (умножить и сложить), и ещё около 4, когда она вычисляет, куда подкрутить веса. Как устроены эти два этапа, вы узнаете на ступенях 1 и 3, а пока достаточно запомнить множитель 6.
Нам понадобится научная запись из урока 0.0.2: — единица с шестью нулями (миллион), — десять миллионов. При умножении таких чисел показатели степени складываются: , а при делении — вычитаются: .
Пример: модель на миллион параметров () читает 10 миллионов токенов (): операций. При 50 GFLOPS ( операций в секунду) это секунд, то есть 20 минут. Так же посчитаем остальные задания курса:
| Ступень | Модель | CPU, 50 GFLOPS | 1 GPU, ~40 TFLOPS | |||
|---|---|---|---|---|---|---|
| 2 | логистическая регрессия | ~1 секунда | мгновенно | |||
| 3 | MLP | ~2 минуты | доли секунды | |||
| 4 | мини-GPT | ~20 минут | секунды | |||
| 4, GPU-трек | GPT на русском корпусе | ~40 дней | ~1.3 часа | |||
| 5 | MiniMind-подобная LLM | ~90 дней | ~2.7 часа |
Названия моделей в таблице пока просто имена: что такое логистическая регрессия, MLP и MiniMind, вы узнаете
на этих ступенях. Сейчас важна только арифметика: и подставляем в и делим на скорость машины.
Последние две строки — условные примеры (миллиард токенов обучения). 40 TFLOPS — условная реальная производительность
одной современной видеокарты в bf16 (осторожная оценка); подставьте свои цифры из bench_flops.py. Оценка для ступени 5
по порядку величины согласуется с заявлением авторов MiniMind: модель на 64M параметров обучается примерно за 2 часа
на одной RTX 3090. На четырёх картах в идеале было бы вчетверо быстрее, но обмен данными между картами по PCIe съест
часть выигрыша. Об этом — в уроке 5.4.3.
Две оговорки. Маленькие модели не загружают GPU полностью, поэтому на ступенях 2–4 реальный выигрыш от видеокарты меньше, чем в таблице. А CPU-столбец посчитан для обычного ноутбука: ваш 48-ядерный EPYC быстрее.
Вывод: ступени 0–3 (Python, математика, micrograd, PyTorch) рассчитаны на CPU. Тесты всех домашних работ тоже выполняются на процессоре, а тяжёлое обучение со ступени 5 проверяется по сохранённым метрикам. Со ступени 4 у вас появляется GPU-трек с моделями в десятки раз больше. На ступенях 5 (претрейн мини-LLM) и 6 (LoRA, GRPO) базовый путь по-прежнему проходится на CPU, но только на крошечных конфигурациях: настоящие эксперименты там требуют видеокарт.
Практика
Заголовок раздела «Практика»- Поставьте Python 3.11+ и создайте окружение
.venvв папке курса (черезvenvилиuv). - Поставьте зависимости (CPU-сборка torch, затем
homework/requirements.txt, затемjupyterlab ipykernel). - Запустите
check_env.pyи убедитесь, что в строкеvenvнаписано «да». - Откройте Jupyter Lab, создайте ноутбук и сравните в двух ячейках скорость Python и NumPy. Понимать каждую
строку пока не нужно — Python начнётся в модуле 0.2, NumPy — в модуле 0.3. Сейчас важно увидеть разницу во времени:
У автора первая строка заняла около 35 мс, вторая — доли миллисекунды (точные цифры зависят от машины и её загрузки). Почему NumPy быстрее в десятки и сотни раз, разберём в модуле 0.3.import numpy as np # подключить библиотеку NumPy под коротким именем npdata = [float(i) for i in range(1_000_000)] # обычный список Python из миллиона чисел 0.0, 1.0, 2.0, …x = np.arange(1_000_000, dtype=np.float64) # те же числа, но в массиве NumPy%timeit sum(v * v for v in data) # сумма квадратов циклом Python — замер времени%timeit x @ x # та же сумма квадратов одной операцией NumPy
- Сделайте Restart Kernel and Run All и убедитесь, что ноутбук выполняется сверху вниз без ошибок.
- Откройте папку курса в VS Code и выберите интерпретатор
.venv.
Проверь себя
Заголовок раздела «Проверь себя»- Python 3.11–3.12, каждому проекту — своё окружение
.venv. Системный Python не трогаем,sudo pipне используем. - Активация ставит
.venv/binв началоPATH. В каждом новом терминале окружение нужно активировать снова. uv— быстрая заменаpipс тем же интерфейсом, умеет сам скачивать Python.- Jupyter удобен для экспериментов, но перед выводами делайте Restart & Run All.
- Обучение стоит FLOP. На первых ступенях это минуты на CPU. Со ступени 4 пригодятся ваши 4 видеокарты, без них — облако, DataSphere или Kaggle.
Дальше: как устроены домашние задания и автопроверка — и первое задание прямо в браузере.