Почему на авито платные объявления: Почему Авито стало платным, как обойти 2023

Содержание

Авито требует оплатить разовое размещение: почему так — МирДоступа



Расскажем почему Авито заставляет платить за размещение объявления…

Любимые читатели Мир Доступа! Мы благодарны Вам за каждый рубль, который Вы отправляете на развитие нашего стартапа! Все деньги идут на вознаграждения авторам, оплату услуг корректора и оплату хостинга. Мы хотим радовать Вас и дальше! Благодаря Вам наш проект продолжает оставаться независимым и полезным. Без Ваших пожертвований мы бы никогда не справились. Спасибо Вам и низкий поклон!

С Уважением, главный редактор Мир Доступа


В последнее время многие пользователи популярной доски жалуются, что Авито требует оплатить разовое размещение.

[adace-ad id=»5173″]

По словам Авито размещение платного объявления позволяет отсеять многократно повторяющиеся объявления и предложения сомнительного содержания. Также платное разовое размещение ограничивает возможность распространения объявлений мошенников.

Требование оплатить разовое размещение позволит добросовестным продавцам быстрее продавать. Авито говорит, что теперь покупатели могут быстро отыскать необходимые товары и услуги — с минимальных риском встретить объявление мошенников

Для компаний и частных предпринимателей, которые используют площадку Авито для ведения бизнеса, платное размещение объявлений появилось не так давно. Для обычных пользователей большинство категорий объявлений остаются бесплатными.

За какие объявления Авито берет плату

Для каждой категории объявлений на Авито существует определенный лимит бесплатного размещения. Более подробную информацию по поводу бесплатного размещения можно найти на Мир Доступа — используйте поиск по сайту с ключевым словом Авито.


Кстати, мы пишем об Авито довольно часто — недавно мы рассказывали что делать если пришло смс с Авито «Перевели деньги»

Читайте нас внимательнее и следите за сайтом 🙂


Вернёмся к нашей теме.  

Бесплатное размещенное объявление действует в течение 30 дней. Когда продавец исчерпает лимит бесплатного размещения ему придется оплачивать все последующие размещения. Если продавец постоянно размещает объявление в какой-то определенной категории, то она всегда будет платной. Остальные категории будут иметь иной лимит бесплатного размещения.

Общий лимит на Авито

В основной категории можно разместить ограниченное количество объявлений в течение 30 календарных дней — это общий лимит и он может быть индивидуальным, в зависимости от категории размещения.

[adace-ad id=»5168″]

Продавец может уложиться в лимит подкатегории, но в общий лимит уже нет. Выход — ждать когда одно из объявлений закроется, либо — купить пакет размещения объявлений без ограничений.

Согласно установленному Авито лимиту каждые 30 дней можно подавать новые бесплатные объявления

Следует учитывать, что если у продавца закончится бесплатный лимит и он разместит несколько платных объявлений, точка восстановления бесплатных объявлений сместиться на 30 календарных дней.

К примеру, в категории детские товары существует лимит на одно бесплатное размещение. Если продавец опубликовал бесплатное объявление 1 марта, то ровно через 30 дней он снова сможет опубликовать объявление в данной категории бесплатно. Если же он разместил платное объявление 5 марта, то следующее бесплатное размещение будет доступно только 4 апреля

Таким образом, проблема Авито требует оплатить разовое размещение скорее высосана из пальца — доска имеет четкие правила, которым пользователи обязаны следовать.


Что-то сломалось или не работает? Расскажите нам о своей проблеме с ТВ, смартфоном, приложением или другим устройством и мы решим её — пишите свой вопрос в комментариях к этой статье, либо — на электронную почту [email protected] — мы обязательно ответим на Ваш вопрос и решим его в течении одной недели. Для наших постоянных читателей скоро будем проводить блиц с необычными призами — следите за сайтом каждый день.


Понравилась статья? Поддержите наш IT-журнал любым удобным способом! Пока что мы держимся на чистом энтузиазме, но зато не делаем заказных обзоров 🙂



«Почему объявления на Авито стали платными?» — Яндекс Кью

Продвижение на Авито и Юле

Популярное

Сообщества

Анонимный вопрос

  ·

197,4 K

Ответить1Уточнить

Цвит Георгий

Предпринимательство

118

Агентство QQROOZA занимается эффективным продвижением на площадках объявлений Авито, Юла…  · 11 нояб 2021  · qqrooza.ru

Доброго времени суток. На Авито до сих пор можно разместить бесплатные объявления о продаже своих товаров (при размещении нужно указывать — продаю свое). Разместить бесплатные объявления можно в рамках лимитов предусмотренных площадкой Авито. Эти лимиты обновляются 1 раз в месяц. То есть, если в рамках лимита в категории (электроника — Аудио и видео — Видеокамеры) доступно 2 бесплатных размещения и вы их уже разместили, то в следующий раз в этой категории вы сможете бесплатно разместить объявление только через месяц.

ВНИМАНИЕ: Бесплатные объявления на Авито доступны не во всех категориях.

Узнать, доступны ли в Вашей категории бесплатные объявления и какие существуют лимиты вы можете из этой статьи.

Приводим от 5 до 40 лидов в день с площадок объявлений (Авито/Юла).

Перейти на qqrooza.ru

петя

1 августа 2022

достали они меня. решил отредактировать действуюшее объявление, дополнив пункты. а эти суки потребовали оплату… Читать дальше

Комментировать ответ…Комментировать…

Игорь Глосковский

Маркетинг

-3

Запускаю для вас управляемое сарафанное радио из обращений клиентов на картах
  · 16 авг 2021  · 1mesto.bz

Потому что если вы хотите дважды прорекламировать в объявлении свою услугу, например — это уже платное удовольствие, n-ое количесто товаров можете там разместить, остальные на платной основе. Таким образом авито коммерцизирует и повышает качество объявлений.

Вы можете выкладывать объявления бесплатно в рамках лимитов:

https://support.avito.ru/sections/136?articleId=2165

Локальный маркетинг. Создание сайтов и готовых связок под ваш бизнес

Перейти на 1mesto.bz

Комментировать ответ…Комментировать…

Первый

Анастасия Кириленко

7

Активист с обостренным чувством справедливости.   · 17 июл 2020

Добрый день друзья;). Объявления на Авито по прежнему остались бесплатными. Каждые 30 дней лимит обновляется для пользователя. Прежде всего это оптимизация сайта, для предотвращения огромного количества копий. К платным объявлениям Вы относитесь с большим вниманием. Всем <3

Nikita

19 июля 2020

Бесплатно разместить объявление о сдаче квартиры от собственника на удалось.

Комментировать ответ…Комментировать…

Mitya Mikheev

62

Умелец  · 24 мар 2021

Жадность. И только жадность.
И не надо тут про собственников, «акционеров» и их интересы разводить сопли. Десяток лет Авито приносила прибыль в режиме бесплатных объявлений, потом начала закручивать гайки и вот сейчас совсем с катушек слетела. При чистой прибыли в 10,6 млрд они ну никак не могут позволить себе бесплатные объявления для пользователей, ага, как же :))
А… Читать далее

Комментировать ответ…Комментировать…

Первый

Игорь

5

квантовая физика, практические исследования природы пространства и времени и кое-что ещё.  · 27 июн 2020

Последствия карантина. Если раньше поднятие (самая эффективная функция) стоила 169р., то сейчас сделать тоже самое + куча малоэффективных «прибабахов» стоит около 1500 кровных рубликов на несколько дней. Так, что ничего личного, только бизнес.

Комментировать ответ…Комментировать…

Первый

Dmitry Slavich 74

4

Хобби, музыка и кино! Спорт; бокс и бои без правил! Люблю хорошие фильмы, наши и. ..  · 22 сент 2020

Авито это бизнес! Те кто им рулит естественно нужно зарабатывать больше денег. Тут все просто! Хочешь что б Твои объявления видели, покупали, Плати! Конкурентов мало, кроме Юлы, и то….Так что монополист Авито рулит, и делает так как им Выгодно.

Комментировать ответ…Комментировать…

Mitya Mikheev

62

Умелец  · 12 апр 2021

Авито еще и сдохнуть решил. Оригинальная бизнес-идея: брать побольше денег, чтобы при этом поменьше вкладываться в развитие бизнеса. Авито сам себя закапывает, учитывая, что все, кому не лень, развивают это же направление (Юла, Яндекс и так далее) Читать далее

Комментировать ответ…Комментировать…

Afftimes

7

Медиа про арбитраж трафика и заработок в интернете: кейсы, гайды, интервью и обзоры.   · 1 июн 2021  · afftimes. com

Отвечает

Ilya Afftimes

Администрация Авито утверждает, что это нужно для борьбы с мошенничеством. А именно – копированием чужих объявлений. Как сказано в правилах Авито, «на площадке должны размещаться только уникальные и качественные объявления». Так покупателям легче искать нужный товар.
Далеко не все объявления стали платными. Просто появился лимит бесплатных объявлений по категориям в… Читать далее

Комментировать ответ…Комментировать…

Ярослав Москвик

-8

Компьютерная тематика.  · 9 июл 2020

Может кому помогу, если указать ‘товар приобретён на продажу’ объявление станет платным, но если указать ‘продаю своё’ объявление станет бесплатным.

Update: Слова «Может кому помогу» Я не просто так поставил

Татьяна

23 сентября 2020

Нет, не стало бесплатным

Комментировать ответ…Комментировать…

Первый

Жаклин

1

8 нояб 2020

Думаю, потому что мы живём в капитализме. Не может быть ничего бесплатного.Здесь, этому приложению нужно учитывать с какой суммы какой процент?И опять же,продаются не новые предметы…шансы продать невелики

Комментировать ответ…Комментировать…

Аудитория — Avito Media

Аудитория — Avito Media

Общие данные

Какая категория вас больше всего интересует?

Компьютер и мультимедиа

Транспорт

Недвижимость

Работа и услуги

Дом и сад

Одежда и здоровье

Другие

Досуг и развлечения

Компании

Ты?
Ваше семейное положение?

50,58%

Замужем

43,53%

Холост

В отношениях

Сколько тебе лет?

50 лет и более

40 — 49 лет

30 — 39 лет

25 — 29 лет

20 — 24 года

15 — 19 лет

0 — 14 лет

Где ты живешь?

Касабланка

Агадир

Марракеш

Кенитра — Уджда — Мекнес

Тетуан — Танжер

Дахла — Эс-Сувейра — Таза — Эль-Хосейма — Надор — Сафи

Ифран — Сеттат

Какую платформу вы чаще всего используете для доступа к Avito.

ma?

Мобильный телефон

Настольный компьютер

Планшет

Автоматические данные

Какая у вас марка автомобиля?

Рено

Пежо

Фольксваген

Мерседес

Citroën — Hyundai — Toyota — KIA

БМВ — Ауди

Опель — Альфа Ромео

Хонда — Шевроле — Сеат — Мицубиси — Ниссан

Кредитные компании

Вафасалаф

Народный банк

Сосьете Женераль

CIH — Салафин

Кредит дю Марок

Кредит Агриколь — Акред — Барид Банк

Таслиф — BMCI Crédit Conso

Сколько у тебя машин?

4 или плюс

Станция обслуживания префере

Африка

Нефть Ливия

Отрес

Какую марку вы бы купили?

Фольксваген

Рено

Мерседес

Пежо

Хендай

Тойота — Ситроен

Опель — Сеат — Ниссан — Ленд Ровер — Хонда

Вы готовы купить машину в ближайшее время?

Данные электронной торговли

Вы уже совершали платежи в Интернете?
Для каких видов закупок?

Сайты электронной коммерции

Сайты для оплаты счетов

Сайты сделок

Туристические сайты

Банковские данные

Какой у тебя банк?

Народный банк

Аттижари Вафабанк

Барид Банк

Сосьете Женераль

Кредит дю Марок

Кредит Агриколь

Вы загрузили мобильное приложение банка?

Я не в курсе

Вы когда-нибудь оформляли потребительский кредит?

Данные о недвижимости

Каков ваш жилищный статус?

Проживание с родителями

Арендатор

Вы когда-нибудь брали ипотеку для покупки своей недвижимости?
Если вы в настоящее время не являетесь владельцем, как вы думаете, когда вы купите собственное жилье?

Не в краткосрочной перспективе

Через 6 месяцев

Через 1 год

Через 2 года

Через 5 лет

Более 5 лет

Кредитные агентства

Вафа Недвижимость

Народный банк

Сосьете Женераль

Кредит дю Марок

Кредит Агриколь

Барид Банк

Какой у вас стиль жилья?

Квартира

Современный марокканский дом

Традиционный марокканский дом

сельский тип жилища

Сектор товаров народного потребления

Чаще всего вы совершаете покупки:

Продуктовый магазин

Средняя поверхность

Большая поверхность

Ваш любимый магазин?

Маржан

Карфур

Атакадао

Ваш любимый магазин бытовой техники?

Электропланета

Базар / Commerce de Proximité

Космос

Le Comptoir Электроменеджер

Ле Танжеруа

Эспас Бадр

Ваш любимый фаст-фуд?

Макдоналдс

Пицца Хат

Бургер Кинг

Туристические данные

Вы собираетесь в отпуск?
Если да, то сколько раз в год?

1 раз

2 раза

3 раза

4 раза

Более 4 раз

Куда вы предпочитаете ездить чаще всего?

Марокко

За границу

В зарубежные страны, на какой континент?

Европа

Африка

Северная Америка

Станьте частью наших 250 партнеров и увеличивайте оборот с Avito. ma

У нас есть ваши будущие клиенты.

Связаться с нами

О компании

Avito.ma является дочерней компанией норвежской группы Schibsted. Присутствуя более чем в 40 странах мира, Schibsted Group насчитывает более 8000 сотрудников. Leboncoin.fr во Франции, Subito.it в Италии, Vibbo.es в Испании и Blocket.se в Швеции.

Оставайтесь на связи

Почему мы перешли с Python на Go в системе рекомендаций Авито | Василий Копытов | АвитоТех | март 2023 г.

Привет! Меня зовут Василий Копытов, я руковожу группой разработки рекомендаций Авито. Мы занимаемся системами, предоставляющими пользователю персонализированную рекламу на сайте и в приложениях. На примере нашего основного сервиса я покажу, когда переходить с Python на Go, а когда оставить все как есть. В конце я дам несколько советов по оптимизации сервисов Python.

Любой, кто заходит на главную страницу сайта или приложения, видит персонализированную ленту объявлений — рекомендации. Нагрузка на наш основной рекомендательный сервис, отвечающий за генерацию бесконечной ленты объявлений на главной странице, составляет около 200 000 запросов в минуту. Общий трафик до 500 000 запросов в минуту на рекомендации.

Так выглядят рекомендации в приложении и на сайте

Сервис выбирает наиболее подходящие объявления из 130 миллионов активных объявлений (элементов) для каждого пользователя. Рекомендации генерируются на основе каждого действия человека за последний месяц.

Представительство работает по следующему алгоритму:

1. Сервис обращается к хранилищу истории пользователя и извлекает из него агрегированную историю действий и интересов.

Интересы — это набор категорий и подкатегорий рекламы, которую человек недавно просматривал. Например, детская одежда, домашние животные или товары для дома.

2. Затем передается история и интересы как набор параметров, воздействие на модели машинного обучения первого уровня.

Модели машинного обучения первого уровня являются базовыми службами. Сейчас у нас есть 4 таких модели. Они предсказывают элементы, используя различные алгоритмы машинного обучения. На выходе каждого сервиса получаем список id (рекомендуемых).

3. Мы фильтруем идентификатор на основе истории пользователя. У нас получается около 3000 элементов на пользователя.

4. И самое интересное, что представление внутри использует модель машинного обучения второго уровня, основанную на CatBoost, для ранжирования рекламы из моделей машинного обучения первого уровня в реальном времени.

5. Из данных готовим характеристики. Это параметры ранжирования рекомендаций. Для этого мы используем id элемента для получения данных в хранилище (осколочная база данных 1 ТБ, Redis). Данные товара — название, цена и еще около 50 полей.

6. Служба передает функции и элементы модели машинного обучения второго уровня на основе библиотеки CatBoost. Результатом является ранжированная лента объявлений.

7. Далее представление выполняет бизнес-логику. Например, подбирает в ленте те объявления, за премиум размещение которых взимается плата (boost VAS).

8. Кэшируем и отдаем сгенерированный фид рекомендации пользователю, в нем около 3000 объявлений.

Алгоритм формирования ленты рекомендаций

Представительство как услуга очень загружено в Авито. Он обрабатывает 200 000 запросов в минуту. Сервис стал таким не сразу: мы постоянно вносили что-то новое и улучшали качество рекомендаций. В какой-то момент он начал потреблять почти столько же ресурсов, сколько и весь остальной монолит Авито. Нам стало сложно выкатывать сервис в дневное время, в часы пик, из-за нехватки ресурсов в кластере — в это время большинство разработчиков развертывали свои сервисы.

Карта взаимодействия сервисов Авито. Размер кружка показывает, сколько ресурсов кластера потребляет служба

Вместе с ростом потребления ресурсов росло и время отклика службы. Во время пиковых нагрузок пользователи могли ждать свои рекомендации до 1,6 секунды — это в 8 раз больше, чем за последние 2 года. Все это могло заблокировать дальнейшее развитие и совершенствование рекомендаций.

Причины этого достаточно очевидны:

  1. Высокая нагрузка, связанная с вводом-выводом. В представлении каждый запрос состоит примерно из 20 сопрограмм — блоков кода, которые выполняются асинхронно при обработке сетевых запросов.
  2. Нагрузка на ЦП от расчетов в реальном времени по ML-модели, которые полностью заняты ЦП, пока происходит ранжирование рекламы.
  3. GIL — представление изначально было написано на однопоточном Python. В этом языке программирования невозможно совместить рабочие нагрузки, связанные с вводом-выводом и с привязкой к ЦП, чтобы служба эффективно использовала ресурсы.

Позвольте мне рассказать вам, что помогло нам справиться с нашими нагрузками в Python.

1. ProcessPoolExecutor

ProcessPoolExecutor создает пул воркеров из процессорных ядер. Каждый воркер — это отдельный процесс, работающий на отдельном ядре. Вы можете передать нагрузку, связанную с ЦП, на рабочий процесс, чтобы он не замедлял другие процессы.

В представлении мы изначально использовали ProcessPoolExecutor для разделения рабочих нагрузок, связанных с процессором и вводом-выводом. В дополнение к основному процессу Python, который обслуживает запросы и ходит по сети (с привязкой к IO), мы выделили три воркера для ML-модели (с привязкой к CPU).

У нас есть асинхронная служба на aiohttp, которая обслуживает запросы и успешно обрабатывает нагрузку, связанную с вводом-выводом. ProcessPoolExecutor создает пул рабочих процессов. Рабочую нагрузку, связанную с ЦП, можно передать такому рабочему процессу, чтобы он не замедлял основной процесс службы и не влиял на задержку всей службы.

Выигрыш времени от использования ProcessPoolExecutor составляет около 35%. Для эксперимента мы решили сделать код синхронным и отключили ProcessPoolExecutor. То есть рабочие нагрузки, связанные с вводом-выводом и процессором, начали выполняться в одном процессе.

Без ProcessPoolExecutor время отклика увеличилось на 35%

Как это выглядит в коде:

 async def process_request(user_id): 
# Задача ввода/вывода
async with session. post(
feature_service_url,
json= {'user_id': user_id},
) as resp:
functions = await resp.json()

return features

У нас есть асинхронный обработчик, который обрабатывает запрос. Для тех, кто не знаком с синтаксисом асинхронного ожидания, это ключевые слова, обозначающие точки переключения сопрограммы.

То есть на седьмой строке кода одна сопрограмма уходит в сон и отдает выполнение другой сопрограмме, которая уже получила данные, тем самым экономя процессорное время. Таким образом Python реализует совместную многозадачность.

 def предсказание (функции) 
preprocessed_features = процессор.препроцесс (представленный)
return model.infer(preprocessed_features)

async def process_request(user_id):
# Задача ввода-вывода
асинхронно с session.post(
feature_service_url,
json ={'user_id': user_id},
) as resp:
features = awat resp.json()

# блокировка CPUtask
return predict(features)

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

 исполнитель = concurrent.futures.ProcessPoolExecutor(man_workers=N) 

по определению предсказать(функции):
preprocessed_features = процессор.preprocess(features)
return model.infer(preprocessed_features)

async def process_request(user_id):
# задача ввода/вывода
async with session.post(
feature_service_url,
json={'user_id': user_id},
) as resp:
features = await resp.json()

# Неблокирующая задача ЦП
return await loop.run_in_executor(executor, predict(features))

Здесь ProcessPoolExecutor вступает со своим собственным пул рабочих, который решает эту проблему. В строке 1 мы создаем пул. В конце блока кода мы берем рабочего оттуда и перемещаем задачу, связанную с процессором, на отдельное ядро. Таким образом, функция прогнозирования будет выполняться асинхронно по отношению к родительскому процессу, а не блокировать его. Приятно то, что все это будет завернуто в обычный синтаксис async-await, а задачи, привязанные к процессору, будут выполняться асинхронно, как и задачи, связанные с вводом-выводом, но под капотом будет дополнительная магия с процессами.

ProcessPoolExecutor позволил нам снизить накладные расходы от модели ML в реальном времени, но и с ним в какой-то момент стало плохо. Первое, с чего мы начали, было самым очевидным — профилированием и выявлением узких мест.

2. Профилирование службы

Даже если служба написана опытными программистами, ее можно улучшить. Чтобы понять, какие части кода медленные, а какие быстрые, мы профилировали сервис с помощью профилировщика py-spy.

Профилировщик строит диаграмму, на которой горизонтальные полосы показывают, сколько процессорного времени тратится впустую на участок кода. Первое, что вы видите, это 3 полосы справа. Это всего лишь наши дочерние процессы для оценки функций модели ML.

Результат профилирования Rec-представления. Например, видно, что воркеры ProcessPoolExecutor для модели ML занимают почти одинаковое количество ресурсов ЦП

На графике пламени мы увидели некоторые интересные детали:

  • 7% процессорного времени тратится на сериализацию данных между процессами. Сериализация — это преобразование данных в байты. В Python этот процесс называется pickle , а обратный — unpickle .
  • 3% времени уходит на оверхед ProcessPoolExecutor — подготовка пула воркеров и распределение нагрузки между ними.
  • 6,7% времени тратится на сериализацию данных для сетевых запросов в json.loads и json.dumps.

В дополнение к процентному распределению, мы хотели знать конкретное время, затрачиваемое на выполнение различных частей кода. Для этого мы снова отключили ProcessPoolExecutor, запустили модель ML для ранжирования синхронно.

Без ProcessPoolExecutor ранжирование происходит быстрее, т.к. все процессорное время занято только подготовкой фич и скорингом по ML модели, нет накладных расходов на pickle/unpickle и IO-wait

Но проблема остается — конкретный кусок кода стало быстрее, но сам сервис стал медленнее.

Поэкспериментировав, мы выяснили:

  • Накладные расходы ProcessPoolExecutor составляют около 100 миллисекунд.
  • Привязанные к вводу-выводу запросы от сопрограмм ждут 80 миллисекунд, то есть сопрограмма засыпает, и Event Loop снова обращается к ней через 80 мс, чтобы возобновить ее выполнение. В Representation есть три большие группы IO-bound запросов — всего на IO-wait тратится 240 миллисекунд.

Именно тогда мы впервые подумали о переходе на Go, так как он имеет более эффективную модель планирования подпрограмм из коробки.

3. Разделить рабочую нагрузку, связанную с процессором и вводом-выводом, на две отдельные службы

Одним из больших изменений, которые мы пытались сделать, было удаление модели машинного обучения в отдельную службу повторного ранжирования. То есть мы сохранили наш сервис представления только с сетевыми запросами, а скоринг ML-модели был на отдельном сервисе rec-ranker, куда мы передавали все необходимые данные и возвращали скоринг для ранжирования. Казалось, что мы немного уменьшим латентность и масштабируем обе части по отдельности.

Эксперимент показал, что мы экономим время на работе модели, но получаем задержку в 270 миллисекунд при передаче данных по сети и json.loads/json.dumps. Нам нужно передать около 4 Мб на запрос, а для очень активных пользователей до 12 Мб данных для модели ML. После масштабирования rec-ranker реплики стали ненамного меньше старого представления, а время отклика не изменилось. Для нашего случая разбиение на сервисы оказалось неудачным решением, поэтому мы вернулись к предыдущей реализации Representation.

4. Оцененная общая память

В службе Представление данные передаются между процессами посредством pickle/unpickle. Вместо этого процессы, которые совместно используют данные, могут указывать на общую область памяти. Это экономит время сериализации.

Максимальная оценка состоит в том, что мы могли бы выиграть около 70 миллисекунд на сериализацию с таким же сокращением времени для объема выполнения запроса, поскольку загрузка/распаковка — нагрузка, связанная с ЦП, блокировала основной процесс Python, обрабатывающий запросы от пользователей. Такой вывод мы сделали по профилю: pickle/unpickle занимает всего 7% процессорного времени, от разделяемой памяти особого профита не будет.

5. Подготовка фич в Go

Мы решили протестировать работоспособность Go сначала на части сервиса. Для эксперимента мы выбрали самую ресурсоемкую задачу в сервисе — подготовку фич.

Возможности в сервисе рекомендаций — данные о товаре и действия пользователя. Например, название объявления, цена, информация о показах и кликах. Существует около 60 параметров, влияющих на результат модели машинного обучения. То есть мы готовим все эти данные для 3000 элементов и отправляем их в модель, и она дает нам оценку для каждого элемента, которую мы используем для ранжирования фида.

Чтобы связать код Go для подготовки функций с остальной частью кода службы в Python, мы использовали ctypes.

 def get_predictions( 
raw_data: bytes,
model_ptr: POINTER(c_void_p),
size: int,
) -> list:
raw_predictions = lib. GetPredictionsWithModel(
GoString(raw_data, len(raw_data)1), model_pt

)
прогнозы = [raw_predictions[i] для i в диапазоне (размере)]
возвращаемые прогнозы

Вот как выглядит подготовка функций внутри Python. Модуль lib представляет собой скомпилированный пакет Go с функцией GetPredictionsWithModel. В него мы передаем байты с данными об элементах и ​​указатели на ML-модель. Все функции подготовлены кодом Go.

Результаты были впечатляющими:

  • Функции Go считаются в 20–30 раз быстрее;
  • весь шаг ранжирования в 3 раза быстрее с учетом дополнительной сериализации данных в байты;
  • отклик главной страницы упал на 35%.

Подготовка фич на Go ускорила загрузку главной страницы сайта с 1060 до 680 миллисекунд Время ранжирования рекомендаций по ML-модели с подготовкой фич. Здесь также нужно учитывать, что в случае с Go у нас синхронный код и мы не используем ProcessPoolExecutor

Результаты

После всех экспериментов мы сделали четыре вывода:

  • Функции Go для 3000 элементов на запрос считаются в 20–30 раз быстрее, что экономит 30% времени.
  • ProcessPoolExecutor тратит впустую около 10% времени.
  • Три группы запросов, связанных с вводом-выводом, занимают 25 % времени пустых ожиданий.
  • После перехода на Go мы сэкономим около 65% времени.

Есть модель ML в представлении-го. Естественно кажется, что ML хорош только для Python, но в нашем случае модель ML на CatBoost и у нее есть C-API, который можно вызывать из Go. Этим мы и воспользовались.

Ниже приведен фрагмент кода на Go. Не буду на этом особо останавливаться, отмечу только, что логический вывод дает те же результаты, что и в Python. C — это псевдопакет, предоставляющий Go интерфейс для библиотек C.

 if !C.CalcModelPrediction( 
model.Handler,
C.size_t(nSamples),
floatsC,
C.size_t(floatFeaturesCount),
CatsC,
C.size_t(categoryFeaturesCount),
(*C.double) (&results[0]),
C.size_t(nSamples),
) {
вернуть nil, getError()
}

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

Мы начали их готовить по коду Go-service. Обучение происходит на отдельных машинах, туда загружается сервисный код в Go, по этому коду готовятся фичи, сохраняются в файл, затем Python-скрипт скачивает этот файл и обучает на них модель. В качестве бонуса обучение также стало в 20–30 раз быстрее.

Representation-go показал отличные результаты:

  • Время отклика главной страницы сократилось в 3 раза с 1280 миллисекунд до 450 миллисекунд.
  • Потребление ЦП снизилось в 5 раз.
  • Потребление ОЗУ снизилось в 21 раз.

Сервис в три раза быстрее написан на Go по сравнению с Python

Мы разблокировали дальнейшее развитие рекомендаций — мы можем продолжать реализовывать тяжелые функции .

В нашем случае переход на Go принес желаемый результат. Основываясь на нашем опыте работы с механизмом рекомендаций, мы определили три условия, когда вам следует подумать о переходе на Go:

  1. сервис имеет высокую нагрузку на ЦП
  2. в то же время высокая нагрузка на ввод-вывод
  3. вам необходимо отправить большой объем данных по сети на подготовить характеристики.

Если у вас есть только рабочие нагрузки, связанные с вводом-выводом, вам лучше придерживаться Python. Переход на Go не выиграет вам много времени, вы только сэкономите ресурсы, что не так важно для малых и средних рабочих нагрузок.

Если сервис использует обе нагрузки, но не передает по сети столько данных, сколько мы, есть два варианта:

  1. Использовать ProcessPoolExecutor. Накладные расходы времени не будут очень большими, а обслуживание не огромным.
  2. Поскольку нагрузка по трафику становится слишком высокой, разделите его на 2 службы — службы, привязанные к ЦП, и службы, привязанные к IO, чтобы масштабировать их отдельно.

Оптимизация службы, с чего начать

Профилируйте свою службу. Используйте py-spy, как мы, или другой профилировщик Python. Скорее всего, ваш код не имеет огромных неоптимальных областей. Но вам нужно повнимательнее присмотреться ко всем небольшим областям, которые будут значительно улучшены.

This entry was posted in Популярное