LINUX.ORG.RU

Leaf 0.2 — высокопроизводительная платформа машинного обучения

 , , ,


7

6

Анонсирован выход новой версии Leaf 0.2. Leaf написан на языке программирования Rust и является модульной, производительной и переносимой платформой машинного обучения.

По тестам на производительность, Leaf 0.2 опережает другие платформы, являясь, на данный момент, самой быстрой платформой машинного обучения. По словам разработчиков, они смогли добиться этого за счёт выбора языка программирования Rust и библиотеки для высокопроизводительных вычислений Collenchyma (также написанной на Rust). Также, за счёт использования библиотеки Collenchyma можно обучать и запускать модели на CPU, GPU, FPGA, и т.д. с использованием OpenCL или CUDA или другого вычислительного языка, на разных машинах и операционных системах, без лишней адаптации кода. Это делает очень удобным возможность разворачивания моделей на серверах, рабочих станциях, смартфонах, а также современных встраиваемых устройствах.

Чтобы ознакомиться, разработчики предлагают установить Leaf 0.2 и поиграться с примерами, включая популярные Глубокие Нейронные Сети как Alexnet, Overfeat, VGG и другие.

>>> Подробности

★★★★

Проверено: subwoofer ()

Что-то смахивает на Гугл перевод, может можно немного скорректировать?! ;-)

Twissel ★★★★★ ()
Ответ на: комментарий от Twissel

Что-то смахивает на Гугл перевод, может можно немного скорректировать?! ;-)

оживил.

dotcoder ★★★★ ()

Чтобы ознакомиться, разработчики предлагают установить Leaf 0.2 и поиграться с примерами, включая популярные Глубокие Нейронные Сети как Alexnet, Overfeat, VGG и другие.

поиграться с примерами

поиграться

Как же вы за#$али. У меня кровь из глаз идет всякий раз, когда я вижу подобные перлы.

anonymous ()

Rust опять всех обскакал? похвально.

umren ★★★★★ ()

Строчка из примера:

"alexnet".to_string()

Раст такой раст, читабельность такая читабельность.

buddhist ★★★★★ ()
Ответ на: комментарий от nutz

Так песец подкрадывается незаметно. Ладно ЛОР, это ресурс для неграмотного технобыдла. Но я уже в статьях солидных изданий встречаю подобные косяки. <старпёр моде он>Тогда как во времена моей юности на закате тоталитаризма за такое прилетало всем, от автора до главреда издания.<старпёр моде офф>

Что же касается самого слова «играться», то оно в таком контексте начало применяться не раньше середины нулевых. По крайней мере, в девяностых я его не слышал даже от конченной гопоты из спальных районов.

anonymous ()

Полноценные проги на расте - это хорошо, но даже в примерах код хуже плюсов. Конструкторы спасают от постоянных to_string и *::new. Местный аналог ifdef вообще ужасен.

Ждем Rust, хотя бы, 3.0

RazrFalcon ()

Просмотрел код примеров и реально чуть не блеванул. Этим реально кто-то собирается пользоваться?

anonymous ()
Ответ на: комментарий от buddhist

читабельность такая читабельность.

А что тут не так с читабельностью? Наоборот же всё очевидно. Может тебе многословность не нравится?

DarkEld3r ★★★★ ()

чорт.

fn frob0(x: i32, s: &str, t: &str) -> &str { // error
  if( x == 0 ) {s} else {t}
}

fn frob1<'a>(x: i32, s: &str, t: &str) -> &str { // error
  if( x == 0 ) {s} else {t}
}

fn frob2<'a>(x: i32, s: &'a str, t: &'a str) -> &'a str {
  if( x == 0 ) {s} else {t}
}

fn main( ) {
    println!( "{}", frob0(1, "0", "1") );
    println!( "{}", frob1(1, "0", "1") );
    println!( "{}", frob2(1, "0", "1") );
}

этож какой-то адов ад. И только для того, чтоб выбрать 1 указатель из 2.

anonymous ()
Ответ на: комментарий от RazrFalcon

Конструкторы спасают от постоянных to_string и *::new

*::new - это и есть «конструктор».

Местный аналог ifdef вообще ужасен.

Почему?

DarkEld3r ★★★★ ()
Ответ на: комментарий от anonymous

Что же касается самого слова «играться», то оно в таком контексте начало применяться не раньше середины нулевых. По крайней мере, в девяностых я его не слышал даже от конченной гопоты из спальных районов.

Чтобы ознакомиться, разработчики предлагают установить Leaf 0.2 и опробовать примеры ...

Исправил. dotcoder запишись на курсы русского литературного.

anonymous ()
Ответ на: комментарий от umren

Rust опять всех обскакал? похвально.

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

anonymous ()
Ответ на: комментарий от anonymous

Кстати, я лично не могу понять, что делает 'a 'b 'huebe?

мимо

RIGHT GONORARY

anonymous ()
Ответ на: комментарий от DarkEld3r

Почему?

Произвольный кусок можно выбрать или только функции? Вложенность?

RazrFalcon ()
Ответ на: комментарий от DarkEld3r

А что тут не так с читабельностью?

let nets: Vec<String> = vec!("alexnet".to_string(), "overfeat".to_string(), "vgg".to_string());

vs

const vector<string> nets = { "alexnet", "overfeat", "vgg" };

.

cfg.add_layer(LayerConfig::new("conv1", conv1_layer_cfg));

vs

cfg.add_layer({ "conv1", conv1_layer_cfg });

RazrFalcon ()
Ответ на: комментарий от RazrFalcon

А что тут не так с читабельностью?

Нужно больше явных приведений типов!

WARNING ★★★ ()
Ответ на: комментарий от RazrFalcon

Произвольный кусок можно выбрать или только функции?

Через атрибут #[cfg(...)] - функции и модули. Через cfg! макрос - произвольные блоки.

Вложенность?

Поддерживается.

DarkEld3r ★★★★ ()
Ответ на: комментарий от RazrFalcon

to_string делает копию и кладет ее в вектор. как-то так.

anonymous ()
Ответ на: комментарий от anonymous

точнее макросом ее потом кладут в вектор.

anonymous ()

Код выглядит как кусок дерьма

Solace ★★ ()
Ответ на: комментарий от RazrFalcon

А что тут не так с читабельностью?

Ну то есть речь о многословности, как я и предполагал. Не согласен, что это плохо влияет на читаемость, тем более, что в этом примере оно и вовсе не нужно:

let nets = vec!("alexnet", "overfeat", "vgg");
Но придумать/написать на расте более многословный код действительно не сложно. Другое дело, что с этим можно бороться, теми же макросами, например. Но вряд ли, это имеет смысл для примеров.

cfg.add_layer({ «conv1», conv1_layer_cfg });

Если LayerConfig не тупо структура с паблик полями, то так не получится. Но это всё равно ерунда - нет никаких сложностей с тем, чтобы метод add_layer принимал два параметра, а не готовый LayerConfig.

DarkEld3r ★★★★ ()

качество кода

Сразу видно, что код писали специалисты по нейронным сетям, а не такие-то там программисты. Примеры выглядят как типичная программа на ФОРТРАНе scientific питоне.

quantum-troll ★★★★★ ()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

Мне не нравится, что строку (?) зачем-то явно превращают в строку. Совершенно контр-интуитивное действие.

// мимопроходил, не исключаю, что просто авторы примера — индусы

buddhist ★★★★★ ()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от buddhist

vec! это макрос. строку в «» он примается как указатель. то есть без to_string будет вектор из указателей. А так - вектор из строк, например.

anonymous ()
Ответ на: комментарий от buddhist

Мне не нравится, что строку (?) зачем-то явно превращают в строку.

Ну тут делается и выделяется память, так что вполне неплохо, что оно явно обозначено. ИМХО.

// мимопроходил1

Ivan_qrt ★★★ ()
Ответ на: комментарий от buddhist

Мне не нравится, что строку (?) зачем-то явно превращают в строку.

Дык, претензия к явности или к «разным видам» строк? Если второе, то в плюсах их ещё больше. Если первое, то язык тяготеет к явности - оно и мне не всегда нравится.

DarkEld3r ★★★★ ()

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

1) Обучение ЧЕМУ?

2) Запускать модели ЧЕГО?

Это что нейронные сети просто тренировать, а на каких данных?

praseodim ★★ ()
Ответ на: комментарий от anonymous

У меня кровь из глаз идет всякий раз

Наверн в детсаде плохо выучил урок что низяя в глаза лазить грязными ручонками. Бактерий понацеплял так ищщо и запустил - вот и результат. Не тяни, сходи к офтальмологу.

anonymous ()

Машинное обучение - это прежде всего МНОГО-МНОГО ЭКСПЕРИМЕНТОВ. Эксперименты - быстрое прототипирования, когда нужно слепить прототип из говна и синей изоленты, чтобы проверить очередную идею. Всё равно 99% идей пойдёт на выброс. Потом уже отлаженный алгоритм можно для продакшена переписать хоть на C++, хоть на чёрте лысом. Гугл с фейсбуком, которые этим занимаются профессионально за деньги - они фишку рубят. И используют динамически типизируемые скриптовые языки. У первого TensorFlow с Питоном, у второго - Torch с Lua. А «быстрое прототипирование на Rust» - это как чугунный дельтаплан на паровозной тяге. А сабжевое поделие - это уровень «о привет чуваки я зделал ещё один парсер markdown - теперь на бреенфаке». Вердикт комиссии: чем бы дитя не тешилось, лучше б просто онанизмом занималось.

anonymous ()
Ответ на: комментарий от anonymous
fn main( ) {
    let frob3 = |x, s, t| if x == 0 {s} else {t};
    println!( "{}", frob3(1, "0", "1") );
}
anonymous ()
Ответ на: комментарий от buddhist

let s: &'static str = «something»; - это указатель на вектор байтов с кусками utf-8 символов в ридонли участке памяти

let s: String = «something».to_string(); - это смарт-указатель на такой же вектор байтов в куче

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

anonymous ()
Ответ на: комментарий от anonymous

ты надеюсь понимаешь, что смысл в функции и результате ИЗ функции, а не просто сравнить x и вернуть что-то? это просто простой пример, который вылился в синтаксический ад

anonymous ()
Ответ на: комментарий от anonymous

Вообще, в функции принято передавать &str, но авторы leaf почему-то решили сделать по другому.

quantum-troll ★★★★★ ()
Ответ на: комментарий от anonymous

Что же касается самого слова «играться», то оно в таком контексте начало применяться не раньше середины нулевых. По крайней мере, в девяностых я его не слышал даже от конченной гопоты из спальных районов.

Утенок. Такое значение этого слова было всегда. Если ты не слышал такого применения живя в определенных местах это не значит что этого не было.

normann ()
Ответ на: комментарий от anonymous

Смысл в том что в расте принято почти полностью прописывать типы входящих аргументов и возвращаемого значения из функции. Если у тебя там x*2 в функции и используется в одном месте, просто лямбду используй и все, компилятор все равно оба варианта к одному результату приведет.

anonymous ()
Ответ на: комментарий от anonymous

А как ты собрался без указания лайфтаймов выбирать один указатель из двух? Ты сто хотел чтобы компилятор по умолчанию считал что у всех параметров должен быть одинаковый лайфтайм? Но что если это не должно быть так, что бывает сплошь и рядом. Что ты можешь предложить с более «вменяемым» на твой взгляд синтаксисом? Думаю, что ничего.

Esteban_Garcia ()
Ответ на: комментарий от Esteban_Garcia

Ты сто хотел чтобы компилятор по умолчанию считал что у всех параметров должен быть одинаковый лайфтайм?

Это очевидное поведение, если ты передаешь в функцию 2/3/50 константных ссылок и возвращаешь одну. Если у тебя одна ссылка может пережить другую, то тут было бы уместно втыкивать лайвтайм.

Вместо этого вкрутили какие-то наркоманские правила по поводу того, что ВСЕ ссылки без указания лайфтайма имеют его разные. Я даже пример не могу придумать, который бы был применим на практике, когда это нужно.

anonymous ()
Ответ на: комментарий от anonymous

в функцию 2/3/50 константных ссылок и возвращаешь одну

Ну передаю я 3 константы, но возвращаю только 2 из них. Или ты хочешь чтобы компилятор записался на курсы экстрасенсов? То есть, чтобы он смотрел в функцию и анализировал, что возвращается? А если я допущу ошибку, и случайно верну не ту строку? Компилятор должен на менять прототип функции?

fn foo<'a>(cond: &str, ok: &'a str, other: &'a str) -> &'a str {
    match cond {
        "foo" | "bar" => ok,
        _ => other,
    }
}
anonymous ()
Ответ на: комментарий от normann

Можно поиграть с примерами, дурень. Играться может шахматная партия. Но шахматисты играют в шахматы, а не играются. Меньше надо было букварь курить.

anonymous ()
Ответ на: комментарий от RazrFalcon

const vector<string> nets = { «alexnet», «overfeat», «vgg» };

= не нужно.

anonymous ()
Ответ на: комментарий от quantum-troll

Сразу видно, что код писали специалисты по нейронным сетям, а не такие-то там программисты. Примеры выглядят как типичная программа на ФОРТРАНе scientific питоне.

Leaf is a Machine Intelligence Framework engineered by software developers, not scientists.

Это же вам не хрен собачий, это

The Hacker's Machine Learning Engine

ЧСВ у ребят, наверное, просто зашкаливает. :)

Когда уже сделают на Rust нормальную библиотеку для линейной алгебры и для работы с ND-массивами? Или уже сделали?

neuron ()
Ответ на: комментарий от anonymous

Можно поиграть с примерами, дурень. Играться может шахматная партия. Но шахматисты играют в шахматы, а не играются. Меньше надо было букварь курить.

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

normann ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.