Архив

Архив раздела ‘Программирование’

Как отладить нестандартную loss-функцию на Keras?

Основная проблема с Loss функцией — это проблема с выводом значений переменных внутри неё, она компилируется и затем выполняется на GPU, где никакой print не работает. Методика для отладки может быть следующая.

1) Создаем 2 numpy-массива, содаржащие TRUE и PREDICTED значения. Например:

2) Делаем стандартную Python функцию которая вычисляет на основе этих переменных Loss. Убеждаемся что она работает верно.

3) Пишем функцию для Keras с использованием бекенда и которая затем будет передваться как loss-функция в метод compile.

4) Вызываем numpy функцию и keras функции:

Убеждаемся что результат одинаков. Если нет правим ошибки.

Как я собирал комп для Deep Learning (год 2017)

21 апреля 2017 Нет комментариев

Выиграв конкурс и получив призовые, встал вопрос о втором компе, который будет играть роль сервера для расчёта нейронных сеток. На своём 980 Ti с 6 GB памяти мне стало тесновато. И например на 3Д свёртках в задаче с раком лёгких я утыкался в лимиты. Да и при запуске расчётов работать за компом становилось не комфортно из-за тормозов интерфейса, да и Youtube особо не посмотришь.

Итак после небольшого изучения рынка и опыта товарищей по цеху, было принято решение собирать компьютер из 4 GPU. Для этого было выбрано 4 видео карты, 2 свежие NVIDIA 1080 Ti 11 GB + 1080 8 GB + 1070 8 GB. Две последние из-за относительной дешевизны. За это решение, впрочем, меня критиковали.

Сразу оговорюсь, что компы я собираю редко и не люблю тратить на это время. Плюс я не знаю много тонкостей в сочетании разных комплектующих. Поэтому я заказывал все комплектующие в одном месте вместе со сборкой. Артур (n01z3) мне посоветовал Регард. Я и до этого там покупал что-то из комплектующих, но не знал что они занимаются и сборкой, которая кстати бесплатная. К тому же у них шикарный конфигуратор: http://www.regard.ru/cfg  Там правда возможно выбрать только 2 видеокарты, но ещё 2 можно написать в комменте к заказу (что я и сделал).

Тонкости
1) Крайне мало материнских плат поддерживают 4 видеокарты, прежде всего из-за их размеров. Топовые видеокарты занимают сразу два слота.
2) Соответственно из-за больших размеров комплектующих лучше заказать корпус максимального размера. Я ориентировался на XL-ATX
3) В пике каждая видеокарта может потреблять более 250W, соответственно 4 это уже 1000W. Не забываем что энергию едят и другие устройства. Поэтому блок питания нужен минимум на 1200 W. Я взял с запасом на 1500 W.
4) Ожидаемо, что при таких потреблениях энергии всё это хозяйство будет сильно греться. Дополнительно в корпус я запихнул 4 вентилятора.
5) Для того что бы комп не вырубался при перепадах энергии я заказал UPS, который держит 1500W, мой стандартный начинал жалобно пищать от перегруза во время работы всех 4 карточек.
6) Изначально я решил не тратиться сильно на процессор, из-за того что одна и та же серия при небольшой казалось бы разнице в производительности может различаться по стоимости в разы. Однако для поддержки 4 видеокарт надо брать процессор с 40 линиями PCI, первый который я выбрал был только на 28.
7) У процессоров есть ограничение на количество поддерживаемой памяти. В моём ограничение было 64 GB (это я выяснил уже постфактум на этапе сборки), однако каким то чудом видно все заказанные 128 GB и я проверил их скриптом, что всё записывается и читается. Вообще я не уверен что для DL нужно 128 ГБ, потому-что я уже давно перешёл от модели зачитки всех изображений в память к работе с отдельными батчами, а там обычно много оперативной памяти не требуется. Batch Generator наше всё.

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

Как запустить программу в Linux которая будет работать после выхода

1) Запустить программу «myprogram»
2) Нажать Ctrl+Z
~~~ [1]+ Stopped myprogram
3) Ввести команду (после процента номер который указан выше [1])
~~~ disown -h %1
4) Ввести (тот же номер):
~~~ bg 1
5) На экране появится [1]+ myprogram &

После выполненных действий можно смело выходить и программа продолжит работать.

Второй метод:
1) Создать новый screen и запустить программу там:
screen -S anyname

word2vec — бинарники под Windows x64

13 ноября 2015 Нет комментариев

Пришлось тут собрать себе word2vec под Windows на 64-х битную платформу. Столкнулся с рядом проблем, поскольку код писался под Linux. Было пару функций POSIX которые пришлось добавлять и Pthreads под Windows искать. Так что если кто-то не хочет мучиться бинарники под Windows (64 бит) в архиве (~350KB).

Количество подписчиков канала на YouTube

19 октября 2013 Нет комментариев

https://gdata.youtube.com/feeds/api/users/НАЗВАНИЕ_КАНАЛА?alt=json-in-script&callback=getYoutubeChannelSubscribers&v=2

НАЗВАНИЕ_КАНАЛА — название канала где требуется посмотреть число подписчиков.

Например:
https://gdata.youtube.com/feeds/api/users/wwwamvnewsru?alt=json-in-script&callback=getYoutubeChannelSubscribers&v=2

Данные приходят в формате JSON. Соответственно на jQuery это можно написать как-то так:

Получить количество пользователей группы Вконтакте через API

17 октября 2013 Нет комментариев

http://api.vk.com/method/groups.getById?gid=ID&fields=members_count

ID — уникальный номер группы. Можно посмотреть его в УРЛ на странице статистики.

Например:
http://api.vk.com/method/groups.getById?gid=44396061&fields=members_count

Тоже самое, но с вызовом CallBack функции «getMemberCount»:
http://api.vk.com/method/groups.getById?gid=44396061&fields=members_count&callback=getMemberCount

На jQuery это можно написать как-то так:

Забавный SEO-случай

2 октября 2013 Нет комментариев

Есть у меня сайтик один развлекательный, с посещалкой около 1000 хостов в день. В один прекрасный день его взломал какой-то «хакер», все по науке залил Shell, короче получил доступ к всему содержимому сайта. Узнал я об этом спустя примерно месяц, когда мне пришло письмо от Гугла, что на моем сайте обнаружены подозрительные страницы. В письме были примеры страничек. Все ссылки содержали в себе папку, которая в общем-то является папкой для ссылочных бирж и контента там заведомо нет. Начал смотреть в чем дело. Оказывается этот умник сгенернил несколько десятков тысяч HTML страниц с содержанием вида «секс шлюхи в Москве» с кучей различных ключевиков и генеренным контентом. Разместил это все в ту самую папочку и каким-то образом направил туда поисковики. Яндекс естессно это все съел, у меня на сайте появилось +20К новых страниц, которые Яндекс просто нещадно полюбил. Весь траффик с этих страниц сливался злоумышленником на какую-то доропартнерку. Я почистил дырки и шеллы и сделал редирект с этой папки на свой сайт (страничку с рейтингами). Траффик вырос с 1000 до 3000 человек в день и держится уже пару недель. ) Так хакер, сам того не подозревая, помог мне накрутить посещалку сайта. Жаль только что посещалка упадет, как только Яндекс осознает свою ошибку и выкинет все эти странички из индекса. Что, впрочем, может занять несколько месяцев.

Как получить значение цифр с кнопок социальных сетей?

15 августа 2013 Нет комментариев

В данной заметке я расскажу как получить цифры с кнопок 6 популярных социальных сетей: Вконтакте, Facebook, Twitter, Google+, Мой мир (Mail.ru) и Одноклассники. Всё ниже написанное действительно на август 2013 года. Под катом приведен пример кода на PHP для получения данных в виде цифры.

Допустим у вас есть URL-странички, для которой вы хотите получить количество «лайков» в соц. сетях.
Для примера будем использовать URL: http://amvnews.ru/index.php?go=Files&in=view&id=3248
Так же вам понадобится закодированное значение Encoded URL: http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248 — в PHP для его получения используется функция urlencode($url);

Список URL по которым можно получить лайки для заданных соцсетей

1) Вконтакте (vk.com)
URL: http://vk.com/share.php?act=count&index=1&url=[Encoded URL]
Пример: http://vk.com/share.php?act=count&index=1&url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: второй параметр у функции VK.Share.count(1, [нужная циферка]);

2) Facebook
URL: http://graph.facebook.com/?ids=[Encoded URL]
Пример: http://graph.facebook.com/?ids=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «shares»

3) Twitter
URL: http://urls.api.twitter.com/1/urls/count.json?url=[Encoded URL]
Пример: http://urls.api.twitter.com/1/urls/count.json?url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «count»

4) Google+
URL: https://plusone.google.com/_/+1/fastbutton?url=[Encoded URL]
Пример: https://plusone.google.com/_/+1/fastbutton?url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: у Google все немного сложнее, так как у него нет готово API для получения цифры. Значение ищите в области кода
<script type="text/javascript">window.__SSR = {c: [нужная циферка] ,a:'bubble' .

5) Мой мир (Mail.ru)
URL: http://connect.mail.ru/share_count?func=mrc__shareInit&url_list=[Encoded URL]
Пример: http://connect.mail.ru/share_count?func=mrc__shareInit&url_list=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «shares»

6) Одноклассники
URL: http://www.odnoklassniki.ru/dk?st.cmd=extOneClickLike&uid=odklocs0&ref=[Encoded URL]
Пример: http://www.odnoklassniki.ru/dk?st.cmd=extOneClickLike&uid=odklocs0&ref=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: второй параметр функции ODKL.updateCountOC('odklocs0','[нужная циферка]','0','0');
Читать далее…

Выбрать каждую N-ую запись из таблицы в MySQL

Все что в квадратных скобках заменяете своими данными

Список баз данных с размером

В консоли на сервере (из под root) набираете: mysql, а там:

SELECT table_schema "Data Base Name", sum( data_length + index_length) / 1024 / 1024 "Data Base Size in MB" FROM information_schema.TABLES GROUP BY table_schema;

Выведется табличка со всеми базами данными с их размером такого вида:

Google и https

Сегодня словил интересный глюк. Сначала небольшое замечание: в последних Plesk галочка SSL для доменов стоит по дефолту, независимо от того есть для него сертификат или нет. В итоге сайт по дефолту доступен по http:// и по защищенному https:// Я никогда не придавал этому значения, ну доступен и доступен.

А теперь сама ситуация: На одном из посещаемых сайтов один из пользователей посетовал, что при заходе с поисковиков ему выдаются сообщения о недействительных сертификатах на сайте и.т.д. Начав разбираться я выяснил что (!!!) Google проиндексировал две версии сайта с http:// и https:// и очень часто стал выдавать в поиске именно https:// версию. К чему это привело можно догадаться, попав на страницу с сообщением об ошибке и страшными словами о безопасности пользователь тупо решал не ходить на сайт. Так что будте бдительны! )

Firewall (полезное)

5 февраля 2013 Нет комментариев

Проверить IP на наличие в черном списке
csf -g IP_ADDRESS
Удалить адрес из временного списка
csf -tr IP_ADDRESS
Удалить адрес из постоянного списка
csf -dr IP_ADDRESS

Для тех кто столкнулся с вирусом km0ae9gr6m

Если у вас есть сайт и вы обнаружили, что кто-то непостижимым образом дописывает в конец файлов JS или PHP кусок javascript’а с тегами /*km0ae9gr6m*/…/*qhk6sa6g1c*/, то источник вашей проблемы это уязвимость в Plesk-панели! Злоумышленник меняет файлы через FileManager встроенный в Плеск. Вы можете убедиться в этом посмотрев ActionLog, где будет много разных заходов в Plesk с разных IP. У меня это выглядело как-то так:

85.221.166.199 user [2012-06-21 17:32:34] 'CP User Login' ('Contact Name': '' => 'name')
188.134.45.0 user [2012-06-22 20:41:18] 'CP User Login' ('Contact Name': '' => 'name')
85.117.53.120 user [2012-06-24 02:53:27] 'CP User Login' ('Contact Name': '' => 'name')
203.179.95.45 user [2012-06-27 05:36:37] 'CP User Login' ('Contact Name': '' => 'name')
46.121.12.88 user [2012-06-27 12:20:59] 'CP User Login' ('Contact Name': '' => 'name')
188.134.45.0 user [2012-06-28 03:10:12] 'CP User Login' ('Contact Name': '' => 'name')
58.186.192.176 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
182.186.199.223 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
119.155.16.97 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
111.95.140.224 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')

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

Что делать?
1) Обновить панель до последней версии включая все апдейты.
2) Поменять все пароли для всех пользователей панели включая админа.
3) Найти все зараженные файлы:
cd /var/www/vhosts
grep -rl --include=*.{php,js,html,htm} "km0ae9gr6m" *

4) Пофиксить их
5) Можно также проверить файлы которые менялись за последние несколько суток:
find ./ -name '*.*' -mtime -7 -print

На всякий случай некоторое время после, следить кто именно заходит через Plesk на ваш сайт. Полезные ссылки (на инглише):
http://blog.unmaskparasites.com/2012/06/22/runforestrun-and-pseudo-random-domains/#comment-19257
http://forum.parallels.com/showthread.php?p=630300#post630300

Использование NeroAAC для кодирования под Linux

26 февраля 2012 Нет комментариев

Те, кто сталкивался с кодированием видео для он-лайна на своих серверах под Linux наверняка в курсе, что средства FFMPEG для кодирования звука в AAC, а именно библиотека libfaac дает ужасное качество на низких битрейтах. Работа над ней была заброшена несколько лет назад и она не поддерживает профиль HE. Ища выход из сложившейся ситуации оказалось, что все не так плохо и для этих целей можно использовать neroAAC (само собой только для личных целей, читайте лицензию ^_^), который дает потрясающие результаты даже для битрейтов вроде 32кбпс.

1) Качаем последнюю версию отсюда: http://www.nero.com/eng/release-notes-nerodigital-nero-aac-codec.html
2) Находим в архиве linux/neroAacEnc и копируем на сервер
3) Устанавливаем: install –D –m755 linux/neroAacEnc /usr/bin/

Предположим раньше мы кодировали так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -acodec libfaac -ab 128k -ac 2 -async 1 "tmp2.mp4"
/usr/bin/qt-faststart "tmp2.mp4" "out.mp4"

Теперь это будет выглядеть так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp2.mp4"
/usr/bin/ffmpeg -i "input.mp4" -acodec pcm_s16le -vn "audio1.wav"
/usr/bin/neroAacEnc -br 65536 -2pass -if "audio1.wav" -of "audio1.aac"
/usr/bin/ffmpeg -i "input.mp4" -i "audio1.aac" -acodec copy -vcodec copy -f mp4 "tmp3.mp4"
/usr/bin/qt-faststart "tmp3.mp4" "out.mp4"

Пояснения построчно:
1) Первый проход кодирования видео (без звука)

2) Второй проход кодирования видео (без звука)

3) Вытаскиваем звуковую дорожку из видео в несжатом виде

4) Кодируем звуковую дорожку в AAC-формат

5) Собираем звук и видео в единый файл без перекодирования

6) Переносим метаданные в начало файла

Profit!

Решение проблемы в MediaWiki с большими категориями (Large Categories)

15 февраля 2011 Нет комментариев

На одном из проектов используется движок MediaWiki. В некоторых особенно больших категориях находится до 40000 статей. После обновления до версии 1.16 было обнаружено, что при заходе на страничку с листингом категории. SQL запрос выполняется более 30 секунд (на не самом медленном сервере).

Пришлось искать решение, но в открытых источниках оно так и не было найдено, так что я посмотрел, как это было сделано в старых версиях движка. Итак, критическое место:
Читать далее…