Как Scalene с ИИ-рекомендациями оптимизирует код Python



Книга Как Scalene с ИИ-рекомендациями оптимизирует код Python

Как правило, Python негласно используется с библиотеками, написанными на других языках. При таком уровне абстракции бывает сложно понять, как улучшить производительность и потребление памяти. Однако подобные проблемы решаются с помощью профилировщика (англ. profiler). 





Этот инструмент выявляет участки кода, требующие наибольших затрат времени и памяти. Scalene  —  отличный профилировщик Python, который целенаправленно занимается CPU, GPU и памятью. В сочетании с ИИ-рекомендациями он помогает быстрее выполнять рефакторинг проблемных участков кода для повышения производительности. 


Применение Scalene


Scalene запускается командой scalene program_name.py. По умолчанию он проводит профилирование CPU, GPU и памяти. Для выбора одного или нескольких вариантов из предложенных применяются флаги: --cpu, --gpu и --memory. Например, scalene --cpu --gpu program_name.py профилирует только CPU и GPU.


Scalene обеспечивает профилирование как на уровне строк, так и функций. Для каждого из этих типов профилирования выделяется отдельный раздел выходной таблицы. Первый раздел включает профилирование всех строк, а второй  —  всех функций. Для профилирования только часто используемых строк и функций добавляется флаг --reduced-profile.



Интерфейсы 


После выполнения команды профилирования результаты отображаются в интерфейсе. Предлагаются два варианта интерфейса: интерфейс командной строки (CLI) и веб-интерфейс. Сравним их на примере следующего файла Python test.py:


size = 1000000

# Большое выделение памяти
x = [i for i in range(size)]
y = [i for i in range(size)]

# Большое время вычисления
for i in range(size):
y[i] = y[i] * y[i]

Интерфейс командной строки 


По умолчанию команда scalene test.py открывает веб-интерфейс. Для применения CLI добавляется флаг --cli:



В таблице представлены три цвета: синий, зеленый и желтый. Синий обозначает профилирование CPU, зеленый  —  памяти, желтый  —  GPU и объема копирования. 





Профилирование CPU показывает время, затраченное на выполнение кода Python, нативного кода (например, C или C++) и времязатраты на систему (например, I/O). В обозначенном примере 45% общего времени работы приходится на код Python в строке y[i] = y[i] * y[i]. Таким образом, это одна из строк, которая подлежит оптимизации для повышения производительности. При суммировании всех процентов в колонках синего цвета получается 100%. 


Профилирование памяти предоставляет информацию о процентном количестве памяти, выделяемой кодом Python. Таблица также отображает потребление памяти во времени и его максимальное значение. Как и ожидалось, создание векторов x и y приводит к наибольшему выделению памяти. Для повышения производительности следует создавать их посредством более оптимальных функций. 


Профилирование GPU и объема копирования показывает время работы GPU и соответственно объем копирования (мб/с). Объем копирования включает копии между GPU и CPU. Обратите внимание, что профилирование GPU поддерживает только NVIDIA GPU. 


Веб-интерфейс 



Веб-интерфейс похож на CLI. Однако в нем некоторые столбцы совмещены, и полученные результаты отображаются в виде шкалы с разными цветовыми оттенками. Например, для профилирования CPU выделяется только один синий столбец, в котором разными оттенками представлено время работы Python, нативного кода и системы. 


Для профилирования памяти и GPU предоставляются дополнительные столбцы: Memorу average, Мemory activity и GPU memory. Memorу average показывает среднее потребление памяти. Мemory activity отображает память, выделяемую Python и нативным кодом, показатели которых обозначаются двумя разными оттенками зеленого цвета. GPU memory указывает на использование памяти GPU.


В отличие от CLI создаются дополнительные файлы с именами profile.html и profile.json, которые содержат отображаемые результаты. Для получения таких файлов в CLI применяются флаги --json и --html .


ИИ-рекомендации


Рассмотренные в предыдущих разделах инструменты помогают определять строки и функции, требующие улучшения. Вместо того чтобы самим разрабатывать варианты оптимизации, вы можете ускорить рабочий процесс за счет генерации ИИ-рекомендаций. К счастью, предоставляется возможность совместного взаимодействия Scalene и OpenAI при наличии ключа API. 


Для получения ключа API создаем или входим в имеющийся аккаунт OpenAI. Далее в правом верхнем углу экрана нажимаем Personal и выбираем View API keys. На этой странице генерируем новый ключ API и копируем его в веб-интерфейс Scalene в раздел advanced options:



Вы можете выбирать из двух предлагаемых типов рекомендаций. Значок взрыва 💥 предусматривает варианты оптимизации для всего участка кода, а значок молнии  —  только для строки. Ниже приведен пример рекомендаций со знаком для test.py, которые в основном включают замены с использованием NumPy: 



4.


# Предлагаемая оптимизация:


# Векторизованные операции позволяют значительно ускорить создание списков.


# Здесь задействуется встроенная библиотека NumPy для создания массива чисел от 0 до size (особого размера) в одной строке.


5.


# Предлагаемая оптимизация: Векторизованная операция с NumPy.


# Векторизованная операция заменяет исходное списковое включение.


9.


# Предлагаемая оптимизация: Векторизованные операции для извлечения преимуществ NumPy.


# Преобразование списка в массив NumPy.


# Векторизованная операция для удвоения всех элементов в y.


После оптимизации версия test.py выглядит следующим образом: 


import numpy as np

size = 1000000

x = np.arange(size)
y = np.arange(size)

y = y ** 2

Полезные ресурсы




267   0  

Comments

    Ничего не найдено.