Kaylee: распределённые вычисления в браузере

    В 1999 году проект SETI@home предложил пользователям предоставлять ресурсы своих персональных компьютеров для анализа радиосигналов из космоса в целях поиска внеземного разума. В рамках этого проекта в университете Berkley была разработана платформа BOINC (Berkeley Open Infrastructure for Network Computing), на основе которой впоследствии были запущены уже упомянутый SETI@home, ABC@home (доказательство abc-гипотезы), Climateprediction.net (улучшение климатических моделей), LHC@home (симуляция столкновений высокоэнергетических частиц) и другие.

    И всё бы хорошо, но для работы BOINC требуется выполнение одного обязательного условия: пользователю требуется скачать, настроить и запустить клиентскую часть. Как же быть, если по каким-либо причинам это невозможно сделать? И как было бы здорово просто кликнуть по ссылке в браузере и вмиг превратить компьютер в звено большой вычислительной сети!

    С этими мыслями я взялся за написание Kaylee.



    С чего всё это начиналось


    Идея написать свой BOINC с браузерами и вычислениями возникла лет 5 назад, когда в 2007-м году, благодаря Вове Казанову, моему замечательному соседу по комнате в университетской общаге, я познакомился с Ubuntu и пересел с C# на Python. В качестве пилотного проекта планировался проект «Распределённых JavaScript вычислений». Но ни знаний, ни опыта, ни настойчивости тогда не хватило.

    Прошло 4 с небольшим года. Желание написать свой фреймворк не пропало, а возможностей стало гораздо больше! В стандарте HTML5 появились Web Workers, позволяющие выполнять javascript код параллельно с основным JS-потоком браузера. По сравнению с предшественниками, V8, SpiderMonkey, Carakan достигли впечатляющих скоростей. CoffeeScript позволяет писать чистый и читабельный код. И наконец, я полюбил Python настолько, что захотелось написать на нём полноценный фреймворк со всеми сопутствующими атрибутами (документацией, пакетами на PyPI и т.д.).

    Какие ставились задачи


    С точки зрения пользователя

    С точки зрения пользователя всё должно выглядеть очень просто: «Не будет ли Вам угодно кликнуть по этой ссылке и оставить компьютер включённым на ночь дабы помочь учёным в поисках лекарства от <тут идёт название страшной болезни>?»

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

    Более трудоёмкий вариант: пользователю приходится участвовать в вычислениях лично, например, выводится картинка которую нужно описать словам.

    С точки зрения программиста

    С точки зрения программиста всё выглядит чуть менее радужно: требуется написать серверную часть распределённого приложения (в терминах Kaylee — Проект) на Python, которая будет составлять Задачи и клиентскую часть приложения на JavaScript / CoffeeScript, которая эти задачи будет решать.
    В первом случае всё решается наследованием и расширением абстрактного класса, во втором — имплементацией двух функций. Всё общение между сервером и клиентом происходит на JSON. Да простят меня адепты node.js, но от программирования на JavaScript и даже CoffeeScript я не получаю и толики того удовольствия, которое получается от программирования на Python.

    И что получилось?


    А получилась Kaylee (в честь героини сериала «Firefly»).
    Kaylee берёт на себя все заботы по организации связи между сервером и узлами (браузерами пользователей) вычислительной сети и хранению промежуточных и конечных результатов, позволяя программисту сконцентрироваться на самом приложении.

    Kaylee может работать практически с любым Python web-фреймворком в качестве фронтенда (из коробки поддерживается Django и Flask).

    В качестве тестового стенда использовались задачи о вычислении значения Пи методом Монте-Карло и «взломе» посоленного md5-хеша. С обоими задачами, как мне кажется, фреймворк справился на ура!

    Товарищи!


    Проект находится на ранней стадии развития и Хабровчане — первые, кому я решился о нём рассказать. Если вам стало интересно, если у вас есть вопросы, педложения, замечания, критика и конечно же желание поучаствотать, всё это горячо приветствуется!

    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 49

      +1
      Спасибо!
      Были мысли о самостоятельной разработке подобного решения, а теперь буду, видимо, использовать ваши наработки!
        –4
        JavaScript — гиблое дело. Производительность низкая, GPGPU не поддерживается.
        Я бы смотрел в сторону Java-апплетов, Silverlight / .NET или NaCl
          0
          вычисления на ГПУ — не менее гиблое дело.
          3 потока считают одно и тоже — у всех трёх разный результат)
            +1
            Это можно учесть.
              0
              Один мой коллега-аспирант 3 года пытался учитывать это, реализуя вычисления в СОКе.
                0
                Полагаю, далеко не у всех проектов есть такая проблема.
              0
              3 потока считают одно и тоже — у всех трёх разный результат)

              Не могли бы вы немного раскрыть, что тут имеется в виду?
              Ошибки в железе? Ошибки во фреймворке? Ошибки в кернелах? Ошибки синхронизации?
                –1
                Думаю коллега так и не выяснил :-D
                  0
                  Вроде беда была в том, что сами ядра в GPU допускают погрешность. А он изначально решил, что это не так. И его система сулившая высокую надежность и все такое давала что то противоположное от его цели.
                    0
                    А FPU абсолютно точно что ли считает?
                      0
                      Звучит довольно странно. GPU с которыми я немного знаком (Radeon, Southern Islands) предлагают вполне стандартные (IEEE 754) операции над 32-битными плавающими числами. Примеры из SDK OpenCL умножают матрицы с относительной погрешностью не более 10-8, что вполне на уровне для float32.
                        0
                        Сам я с GPU не работал. я сразу пошел по другому пути. А ему нужны были целые числа в первую очередь(как маленькие так и очень большие).
                        • UFO just landed and posted this here
                            0
                            Nvidia GTX 560 или что то в этом духе было
                +2
                Производительность вполне даже хорошая. Самое важное — javascript VM есть у всех, и ставить ничего дополнительно не нужно. В отличие от Java, NaCl или, прости госпадя, .NET.
                  +1
                  Даже если и не такая большая, как с NaCl или .Net, то просто куда проще взять количеством добровольцев, готовых просто держать открытую вкладку.
                    +1
                    Если производительность NaCl в 3 раза больше производительности JavaScript (что, вероятнее всего, истина), то из-за того, что пользователи Chrome составляют 1/3 интернета и у них у всех есть NaCl, они как минимум дадут те же вычислительные ресурсы.
                      0
                      Кроме того, большинство вычислительных фреймворков — native code
                    0
                    Зато охват шире. Вот у меня нет на машине (и не появится) Java и Silverlight и Хромом я не пользуюсь. А JS работает. Причём JS работает и на моём планшете.
                      0
                      Не думаю, что имеет смысл производить научные вычисления на планшете.
                      Про ваш конкретный пример я написал выше. На всякий случай повторюсь: NaCl, вероятнее всего, как минимум в 3 раза быстрее лучшего JS движка. Хром как минимум у трети пользователей. Отсюда вывод: суммарная производительность, которую может предложить NaCl как минимум не ниже суммарной производительности JS. Но у него есть дополнительное преимущество: многие вычислительные библиотеки написаны на C++/FORTRAN
                        +1
                        Это же проект распределённых вычислений, он работает на всё подряд, на чём уж пользователь запустит. Лучше иметь два клиента: на NaCl и JS.
                          +1
                          Понятно, что лучше на всём подряд. Но если стоит выбор NaCl vs JavaScript следует выбирать NaCl по указанной выше причине.
                            0
                            Согласен.
                              0
                              Будем думать и о NaCl.
                        +2
                        Постоянно слышу, как люди говорят: JS — это плохо, плохой язык, очень простой, никуда не годится, ни для чего использовать нельзя, разве что для простеньких скриптов…

                        И моё мнение об этих людях — они совершенно не знакомы с JavaScript.

                        Ну посмотрите хотя бы вот эту вот демку:
                        triggerrally.com/
                          0
                          Это просто демка.
                          Посмотрите на FarCry или Need For Speed. Почувствуйте разницу, о которой идёт речь ;-)
                            0
                            Тогда вот:
                            hexgl.bkcore.com/
                            carvisualizer.plus360degrees.com/threejs/
                            mrdoob.github.com/three.js/examples/webgl_materials_cubemap.html

                            Вы полагаете, что такое сравнение корректно? Сравнивать пару демок, написанных на коленке, с продуктом, разрабатываемым большой компанией? Которая этим и зарабатывает на жизнь.
                            Если бы та же EA Games обратила внимание на WebGL (полагаю, уже обратила и экспериментирует), мы бы имели в вебе тот же Need For Speed. Ничуть не хуже
                              0
                              Графика на уровне Quake 3.
                              WebGL — это OpenGL ES 2.0, API 2001-ого года.
                                0
                                Так WebGL только-только появилось, что вы от него хотите?
                            +1
                            Мой рекорд — 7 кувырков в воздухе.
                              0
                              Вот странно: не Need For Speed вроде, а затягивает :)

                              Мой рекорд — метра два по отвесной стене снега)
                            0
                            Java vs JS в вопросе математики

                            www.redcode.nl/blog/2012/07/java-speed-of-math/
                            0
                            А демо есть? Посмотреть хочется сколько оно кушает и как ведет себя)
                            +3
                            Мой проект javascript-ecdc (фреймворк для создения распределенных браузерных вычислительных сетей) схож с вашим по идеям, но только от начала и до конца на JavaScript (Node.js, Vanilla JavaScript). Даже как-то писал статью на подобную тему habrahabr.ru/post/119692/
                            Пишите если интересно сотрудничество :)
                              0
                              Здорово! Смотрю у вас очень много реализовано из того, что должен иметь подобный фреймворк :)
                                0
                                Здорово!
                                Сам разрабатываю что-то подобное в рамках своей магистерской работы, тоже на node.js+js. Жалко, что раньше не наткнулся на вашу статью, может избежал бы множества граблей))
                              0
                              Таким образом биткойны добывались, пока не начали их майнить на GPU. После это было бесполезно.
                              Кроме того, если я не ошибаюсь, там была проблема в том, что отъедались все процессорные мощности, которые были. Нельзя было использовать только, к примеру, 40% процессора. В итоге все порядком тормозило.
                              Как сейчас обстоит с этим у вас?

                              Многие проекты в Боинке используют GPU (и получают огромный прирост производительности). Яваскрипт вроде как не может использовать GPU напрямую?

                              У Боинка просто огромнейший плюс — в наличии инфраструктуры. Есть универсальный клиент, что-то типа универсальной CMS для сайта, огромный опыт разработки приложений для этой платформы. Есть общие системы статистики по проектам, огромное сообщество кранчеров.

                                0
                                Да, процессорные мощности отъедаются большими порциями (универсальный чит — запуск на многоядерных архитектурах). А вообще эта проблема — ещё та заноза и пути её решения, как мне кажется, не добавляют элегантности коду. Можно например вместо внешнего цикла вызывать минимальную процедуру вычислений по таймеру, отслеживать период выполнения и блокировать вычисления каждые 10 миллисекунд. И весь этот кошмар из-за отсутствия sleep() у WebWorker'ов.
                                  0
                                  (универсальный чит — запуск на многоядерных архитектурах

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

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

                                  Я бы, на вашем месте, рассказал об этой разработке на профильных форумах(хотя бы на том же boinc.ru) — там есть люди, которые обладают опытом создания и использования подобного рода систем и, возможно, смогут вам чем-то помочь)

                                  В общем, я надеюсь, Kaylee поможет развитию распределенных вычислений и науки в общем:)
                                0
                                Есть предложения. Пишите примеры реального использования.
                                  0
                                  Не одобряю, и так браузер превратили не пойми во что, 8 Гб памяти на компе, и последний Хром сжирает половину, а еще в 2008 году можно было жить на компьютере с 2 Гб свободно.

                                  Куда катится мир.
                                    0
                                    Браузер нужен чтобы работать в интернете, распределенные вычисления это конечно круто, так сделайте отдельный клиент для них, и пусть те, у кого комп простаивает — врубают их.
                                    Не по наслышке знаю, что мощный завис вынуждает перезагружать компьютер.
                                      0
                                      Вы что-то делаете не так, я до сих пор живу с 1,5Гб оперативки свободно.

                                      Разве что андроид не пособираешь.
                                      0
                                      Я правильно понимаю, что Kaylee и BOINC не совместимы, то есть нельзя просто запустить браузер и подрубиться к SETI@home и другим подобным проектам?
                                        0
                                        Да, к сожалению так. Думаю можно было бы организовать совместимость BOINC<->NativeClient как предлагали выше, но у Kaylee чуточку другие цели.
                                          0
                                          jsLOIC)
                                        +5
                                        >>И как было бы здорово просто кликнуть по ссылке в браузере и вмиг превратить компьютер в звено большой вычислительной сети!

                                        хмм, Я думаю таких ссылок полно :) Особенно если браузер — ИЕ6 и нет антивируса.

                                        Only users with full accounts can post comments. Log in, please.