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

Среди новых навыков и инструментов, которые я получил, одним из моих любимых был JupyterLab, интерфейс, который позволял мне быстро проводить различные эксперименты с различными фрагментами кода и моделями машинного языка для задач, над которыми я работал. Нашей первоначальной установкой была Jupyterlab на процессорном сервере Paperspace, где я начал экспериментировать с различными моделями НЛП и автоматического распознавания речи от Huggingface. JupyterLab позволяет взаимодействовать с ячейками блокнота нелинейным образом. Вы можете запускать ячейки в любом порядке, изменять их и выполнять повторно. Ядро поддерживает состояние переменных и их данных на протяжении всего сеанса записной книжки, обеспечивая интерактивный характер JupyterLab, но это может привести к беспорядочным, неорганизованным записным книжкам, поэтому я быстро понял, что организация моих экспериментов с ячейками уценки и комментариями к коду было очень важно. Одной из моих любимых функций было добавление %%time вверху ячейки, которое выводит количество времени обработки, затраченного на эту ячейку. Эта информация была критической для моей работы, так как я был сосредоточен на максимально возможной оптимизации скорости, поскольку наше приложение должно было быть веб-продуктом, ориентированным на потребителя.

Еще одним совершенно новым для меня аспектом стажировки была настройка сеансов Screen в терминале для развертывания кода. С помощью сеанса экрана вы можете запустить задачу или развертывание кода, а затем отключиться от сеанса и закрыть терминал или SSH-соединение. Процесс продолжает работать в фоновом режиме в сеансе экрана. Это предотвращает любое прерывание или прекращение процесса в случае потери соединения, что позволяет успешно завершить развертывание кода. Мне стало удобно использовать командную строку для развертывания моих конечных точек API через приложение Flask, которое я написал на Python, и в конечном итоге я перешел от использования команды flask к более готовому к работе Gunicorn, используя, конечно, сеанс экрана.

Наконец, самый важный вывод, который я сделал во время этой стажировки, заключался в том, что как инженер я должен стараться раздвигать границы любой проблемы или проблемы, с которыми я сталкиваюсь. Одним из примеров этого было, когда я работал со сторонним API, у которого было ограничение на размер того, что я отправлял. Я воспринял это ограничение буквально и обрезал файл в тех местах, которые имели наибольший смысл, и в основном отбросил дополнительные данные (вау, я такой n00b). После обсуждения со старшим инженером, который был моим наставником, я узнал, что вместо этого я могу программно обрезать файл и отправлять каждый сегмент в виде отдельного запроса, а затем снова собирать ответы в правильном порядке. Позже я узнал, как сделать этот процесс еще быстрее, используя исполнитель пула потоков в python для одновременной отправки запросов. (Обратите внимание, что многие сторонние поставщики устанавливают ограничения на одновременные запросы, поэтому это не всегда масштабируется.) Это привело к увеличению скорости на 87% и быстро стало моим секретным оружием. В любое время, когда я мог, я использовал пул потоков для выполнения одновременных запросов.

Другой пример творческого решения проблем произошел в предпоследний день моей стажировки. Я работал с API завершения чата OpenAI, и на ответ уходило много времени. Это было для одного запроса, поэтому я не мог использовать пул потоков. За несколько недель до этого я провел небольшое исследование о том, как ускорить работу API, и вспомнил, что читал об использовании потоковых данных, чтобы клиент мог немедленно использовать данные по мере их поступления, а не ждать завершения всего ответа. Хотя общее время будет почти таким же, это будет лучше для конечного пользователя, потому что вместо того, чтобы ждать, он сразу же увидит ответ. К счастью, у OpenAI есть опция stream=true в их API завершения чата для отправки токенов обратно в потоке, и это было идеально для нашего случая использования, так как это также выглядит как анимация ввода чат-бота. когда вы получаете данные в потоке и публикуете их на странице по мере их поступления. Что касается внешнего интерфейса, я узнал об использовании EventSource в javascript для настройки постоянного соединения для получения потока. Этот пост в блоге был чрезвычайно полезен в том, как все настроить.

Что касается некоторых заключительных мыслей, просто невероятно, как многому я научился и вырос как инженер, работая над реальным продуктом с другими инженерами всего за 8 недель. До этого момента я в основном создавал личные проекты или вносил свой вклад в открытый исходный код, и я жаждал наставничества, чтобы помочь вывести свои способности на новый уровень. Наличие старшего, который направлял меня и поддерживал меня, оказало огромное влияние на мои способности, а также моя уверенность значительно возросла, когда я увидел, что могу взять на себя ответственность и решить большинство проблем с помощью всего пары советов или отзывов о том, как стать лучше. Подотчетность перед командой, участие в сеансах парного программирования и использование git для совместной работы над кодом также сыграли важную роль в моем росте. Я очень благодарен всей команде и, честно говоря, не мог бы и мечтать о лучшем опыте стажировки.