Архив автора: Yuriy Nazarov

Yuriy Nazarov

Люблю machine learning

Парсим wikidump на Apache Spark

Текст википедии используется во множестве экспериментов машинного обучения, но как его получить самостоятельно, например для самой свежей версии или редкого языка?
Достаточно функциональной я нашёл библиотеку mwparserfromhell

Распаршенные данные можно сохранить в текстовых файлах, базе данных или в табличном формате на распределённой файловой системе. Но начать в любом случае нужно с дампа, который находится на dumps.wikimedia.org
Для параллельной обработки любым из способов удобнее будет скачать дамп в виде множества файлов вида enwiki-20200201-pages-articles-multistream1.xml-p10p30302.bz2

Для локальной обработки подойдёт код вида:

Но mwparserfromhell довольно требовательная к ресурсам библиотека. На обработку всей английской википедии требуется порядка 8 CPU дней. Поэтому воспользуется фреймворком распределённых вычислений Apache Spark.

Для доступности со всех вычислительных нод, следует разместить данные в распределённой файловой системе HDFS. Предварительно распаковав bz2 файлы, чтобы не тратить на это вычисления при каждом чтении.

Теперь xml файлы доступны для обработки, но ещё не разделены на отдельные страницы. Сохранить отдельные документы я решил в parquet файлы, которые могут хранить схематизированные таблицы. Для работы с xml я решил воспользоваться библиотекой com.databricks:spark-xml

Далее из текстов, содержащих wiki разметку требуется выделить чистый текст. В mwparserfromhell для этого есть метод strip_code().
Т.к. не на всех нодах нужная python библиотека может быть предустановлена, выполним дополнительный шаг prepare c pip install —user mwparserfromhell

Для его запуска нужно выполнить


После выполнения скрипта, можно посмотреть на результат

Домашняя 40GbE сеть

Недавно я заинтересовался темой настройки домашнего hadoop/hdfs/spark кластера, т.к. от апгрейдов осталось какое-то железо, а данные даже дома хочется обрабатывать в парадигме, которая масштабируется.

Вычислительно сложные задачи не всегда упираются даже в 1GbE соединение, но накладные расходы оно всё же вносит. Например, подсчёт слов в английской википедии с локальными данными выполняется за 10 минут, а с данными на соседней ноде — за 13 минут. Для их минимизации решил проапгрейдить сеть.

Доступные 10GbE сетевые адаптеры можно было найти уже давно, но неожиданным для меня оказалось, что 40GbE не дороже. На Авито и eBay Mellanox Connectx-3 mcx354а можно купить за $50.

Из приятного, в ubuntu 18.04 с ядром 5.3 сетевой интерфейс был доступен сразу после загрузки, без какой-либо дополнительной настройки.
Настройки потребовал только mtu. Его увеличение положительно сказывается на скорости.

А с настройкой mtu при загрузке возникли сложности, которые уже зарепорчены в https://bugs.launchpad.net/netplan/+bug/1724895
После применения рецепта из тикета, конфиг стал такой:

И можно не переживать о деградации производительности после перезагрузки.

Погружение в machine learning

До недавнего времени я занимался исключительно разработкой програмного и немного аппаратного обеспечения, но смена места работы подтолкнула меня открыть для себя целый новый мир машинного обучения. Хоть я и был знаком с реализацией некоторых методов ML ещё с университета, но осознание масштабов его применения стало для меня открытием.
Приведу нуже ссылки материалов, которые посчитал полезными:

Курсы

coursera.org/learn/vvedenie-mashinnoe-obuchenie — курс по ML, который отлично «вправляет мозги»

Модели

rusvectores.org/ru/ — word2vec модели для русского языка

Библиотеки

tensorflow.org/tutorials/ — туториалы к библиотеке по ML, которые объясняют почему модели работают. Например отличный разбор word2vec.
scikit-learn.org — swish army knife дата саентиста. Для тех, кто хочет чтобы «просто работало». До меня медленно доходило, что применение нового инструмента часто приносит больше пользы, чем мучительное допиливание старого. Т.е. для проверки гипотез рекомендовал бы именно эту библиотеку вместо более низкоуровневых и дающих больше контроля вроде tensorflow.
Читать далее »

Аппаратный эмулятор нажатий клавиш для Windows

Возможно вы просто искали способ эмуляции нажатия клавиши в приложении, и хотели найти SendMessage(WM_KEYDOWN)+SendMessage(WM_KEYUP) или SendInput(), но если вы уже столкнулись с тем, что этот способ вам не подходит, как, например, в играх, которые специально защищаются от подобных методов для усложнения жизни ботописателям, добро пожаловать под кат.

Читать далее »

Компактное хранение исходного кода

kernel-zip-src

При реализации проекта DistTest возникла необходимость собирать ядро linux из разных версий исходников. И первым решением было загружать готовые архивы исходников с kernel.org для каждой отдельной версии. Но вскоре стало понятно, что данный подход требует значительного дискового пространства: 0.5-1ГБ на каждую версию, которых в данный момент порядка 1000. А также данные подход позволяет собирать только именованные версии, но не версии соответствующие отдельным коммитам.

Для решения проблемы дискового пространства можно хранить несколько базовых версий и приводить их к необходимому виду с помощью патчей, но это приводит к значительному объёму I/O со случайным доступом, что выполняется медленно на HDD и приводит к износу SSD. Тот факт, что исходники необходимой версии требуются лишь временно, подсказывает использовать tmpfs. Но есть более эффективный подход в плане использования оперативной памяти — хранить в tmpfs только отличающиеся от уже имеющихся файлов, что позволяет сделать aufs.

Читать далее »

Очередные часы медитации

20160117_032235

 

Читать далее »

Запуск дистрибутива linux как приложения

Запуск виртуальной машины с последовательным портом в качесте консоли и перенаправлением его в stdio процесса qemu:

Для примера работы эмулятора будем использовать дистрибутив tinycore linux:

Пересборка initrd образа:

Пример вывода(перенаправление консоли ядра отключено для наглядности):

glibc’s memory allocator

malloc_never_fails_tshirt-r8bdfeac6456e4703803a0d7bb91679da_va6lr_512
Когда приложение интенсивно создаёт и удаляет различные объекты при этом не производя над ними каких-либо ресурсоёмких вычислений, производительность приложения ограничивается в основном подсистемой управления памятью. И для более аккуратной разработки приложения необходимо воспринимать эту подсистему уже не как «чёрный ящик», а уже учитывать некоторые его особенности. Рассмотрим аллокатор из библиотеки glibc на платформе linux x86_64.

Какое же API предоставляет аллокатор из glibc? Как он работает? Какие неожиданности в себе таит? Читать далее »

Не нравится язык? Напиши его себе сам.

Во время поиска документации по незнакомым функциям стандартной библиотеки, наткнулся на удивительную фичу Perl’а — source filters. Она позволяет выполнять препроцессинг исходного кода перед выполнением. Обработка может производится как кодом на C, так и кодом на самом Perl’е, что является наиболее переносимым вариантом.
Так чего же он нам позволяет добиться?
Многого! Например можно добавить возможность использовать прототипы функций с именованными аргументами, которые появятся только в Perl6.

Или изменить синтаксис чуть сильнее:

Читать далее »

Заблуждения о файлах

Если удалить файл, свободное место увеличится на размер файла.

Ну, во-первых, файл очень часто занимает отличное от своего размера место

Если удалить файл, свободное место увеличится.

В большинстве файловых систем Linux место не освободится пока файл не закроют все процессы, работающие с ним.

Если удалить файл, свободное место увеличится, когда файл все закроют.

Вот в hfsplus в Linux 2.6.32-2.6.36 не так. В 2.6.37 это таки пофиксили.

Ну оно хотя бы не уменьшится при удалении?!

Много чудных файловых систем можно встретить. Вот например nilfs

Если дописать информацию в файл, занятое им место на диске увеличится.

Файловые системы со сжатием могут сжать новый файл лучше.

Одному имени файла всегда соответствует один и тот же файл.

Файлы кто-то может переименовать (c)ваш К.О. Даже в самый неожиданный момент (c)всё тот же К.О. Читать далее »