Shanraq.org Shanraq.org
IT

AI без LLM: создаем свою модель ИИ Урок 28 из 30

Урок 28. Измеряем время, память и цену

Чайник после включения греется дольше, чем уже горячая вода наливается в чашку. У программы тоже различаются новый запуск и повторный вызов готовой функции. Измерим оба пути, объём файлов и наблюдаемые выделения памяти.

Текст переведён с помощью ИИ.

Зачем это нужно

Чайник после включения греется дольше, чем уже горячая вода наливается в чашку. У программы тоже различаются новый запуск и повторный вызов готовой функции. Измерим оба пути, объём файлов и наблюдаемые выделения памяти.

Перед кодом

Скопируйте bench.py, checks.py и examples.json из папки шага 28. subprocess.run пять раз создаёт новый Python-процесс; sys.executable выбирает тот же Python. Опция -c запускает переданную строку кода, capture_output=True прячет её вывод, text=True читает его как текст, check=True остановит замер при ошибке. range(5) даёт пять чисел для пяти повторов; так же range(200) даёт 200 повторов. time.perf_counter_ns() — точные часы в наносекундах, где миллион наносекунд равен миллисекунде. statistics.median выбирает середину упорядоченных измерений: единичный всплеск меньше влияет на результат. После одного разогрева цикл из 200 вызовов меряет готовую функцию. tracemalloc.start() включает слежение за выделениями Python, get_traced_memory() возвращает текущий и наибольший наблюдаемый объём, а stop() выключает слежение. Path.stat().st_size даёт число байтов двух файлов.

Файлы этого шага: examples.json, checks.py, bench.py.

Из корня проекта перейдите в папку шага и запустите программу:

cd course/kazakh-ai/step-28
python3 bench.py

В Windows замените python3 на py.

import statistics
import subprocess
import sys
import time
import tracemalloc
from pathlib import Path

from checks import classify

question = "Шахмат қашан?"
cold = []
for repeat in range(5):
    start = time.perf_counter_ns()
    subprocess.run([sys.executable, "-c", "from checks import classify; classify('Шахмат қашан?')"],
                   check=True, capture_output=True, text=True)
    cold.append(time.perf_counter_ns() - start)
classify(question)
times = []
tracemalloc.start()
for repeat in range(200):
    start = time.perf_counter_ns()
    classify(question)
    times.append(time.perf_counter_ns() - start)
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
files = Path("checks.py").stat().st_size + Path("examples.json").stat().st_size
print("Сұрау саны:", len(times))
print("Жаңа іске қосу, мс:", round(statistics.median(cold) / 1000000, 3))
print("Ортаңғы уақыт, мс:", round(statistics.median(times) / 1000000, 3))
print("Ең көп бақыланған бөлу, байт:", peak)
print("Код пен дерек, байт:", files)
print("Тікелей API төлемі: 0; құрылғы мен еңбек құны есептелмеді")

Файлы шага.

Что делает программа

Числа зависят от компьютера, нагрузки и версии Python, поэтому эталон — названия строк и положительные измерения, а не фиксированные миллисекунды. Время разогретой функции не включает чтение examples.json, запуск Python и поиск факта. tracemalloc не показывает всю память процесса; сумма размеров файлов не равна памяти программы. Строка о нулевой прямой плате API означает лишь отсутствие платного внешнего запроса в этом опыте. Устройство, электричество, разметка и сопровождение стоят денег. Сравнение «в тысячу раз» с LLM здесь не доказано: нужны одинаковые запросы, качество и условия измерения.

Опорная карта

5 новых процессов → медиана запуска; 200 вызовов → медиана функции + выделения; файлы → байты; плата API → только прямой сбор.

Вспомните и проверьте

Закройте код и назовите, почему два измерения времени различаются. Запустите программу дважды, не переписывая числа из чужого компьютера. Эталон: Сұрау саны: 200, строки нового запуска, среднего времени, выделений, байтов и прямой платы API. Подсказка: в новом процессе Python заново читает модуль и данные. Частая ошибка: называть peak полной памятью приложения или объявлять победу над LLM по одному числу.

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Комментарии (0)

Пока нет комментариев. Будьте первым.