Telegram Group Search
Рост производительности машинного обучения с Rust

В этой статье я хочу поделиться своим опытом создания небольшой платформы для машинного обучения (ML) с нуля, используя язык программирования Rust.

Для моего эксперимента у меня были следующие цели:

1 - Я хотел выяснить, приведет ли переход с Python + PyTorch на Rust + LibTorch (библиотеку C++, используемую в PyTorch) к ощутимому увеличению скорости, особенно в процессе обучения модели. Как мы знаем, модели машинного обучения становятся все больше и требуют все больше вычислительных ресурсов для обучения, что иногда недоступно для обычного человека. Один из способов уменьшить требования к аппаратному обеспечению — найти способ сделать алгоритмы более вычислительно эффективными. Зная, что в PyTorch Python является лишь верхним слоем над LibTorch, мой главный вопрос заключался в том, стоит ли заменять этот верхний слой Python на Rust. План заключался в том, чтобы использовать библиотеку Tch-rs Rust для работы с тензорами и функцией автоградента из DLL LibTorch, которая будет выступать в качестве "калькулятора градиентов", а затем разработать остальную часть с нуля на Rust.

2 - Я хотел, чтобы код был достаточно простым для четкого понимания всех выполняемых операций с линейной алгеброй и позволял легко расширять его при необходимости.

3 - Насколько это возможно, моя платформа должна позволять мне определять модели машинного обучения по структуре, аналогичной стандартной Python/PyTorch.


https://betterprogramming.pub/boosting-machine-learning-performance-with-rust-aab1f3ae1424

👉 @rust_lib
Понимание и реализация смарт-указателя Arc и мьютекса на Rust

Rust  —  язык системного программирования с акцентом на безопасности, многопоточности, производительности. В этом руководстве рассмотрим два примитива многопоточности Rust: Arc и Mutex.

При написании многопоточного Rust рано или поздно встречаются типы Arc и Mutex. Mutex применяется во многих языках, а вот Arc вряд ли найдется где-то еще, кроме Rust. Нельзя полностью понять эти концепции, не связав их с моделью владения Rust. Эта статья  —  мой подход к пониманию Arc и Mutex в Rust.

https://towardsdev.com/understanding-and-implementing-rusts-arc-and-mutex-b54e8e3c1821

👉 @rust_lib
Полезные фичи в Rust

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

https://habr.com/ru/companies/otus/articles/833498/

👉 @rust_lib
ytdlp-gui

Это графический интерфейс для yt-dlp, написанный на Rust

Его можно легко установить в GNU/Linux и Windows системах

https://github.com/BKSalman/ytdlp-gui

👉 @rust_lib
Просто спарсь что угодно с помощью языка Rust (ну… или просто скачай файл)

Известно, что Rust — типобезопасный язык программирования, код которого проверяется компилятором ещё до сборки. С одной стороны это хорошо: меньше вероятности внезапного сбоя в самый неподходящий момент. С другой стороны — код, выполняющий одну функцию, в итоге может стать очень сложным и иногда нечитаемым.

В пример привожу функцию, которая парсит названия валют с сайта floatrates и выводит их (пожалуйста, напишите в комментариях, за сколько минут вы поняли эту строку):


// main.rs
use anyhow::anyhow;
use reqwest::blocking::get;
use scraper::{Html, Selector};

fn main() -> anyhow::Result<()> {
let body = get("http://www.floatrates.com/json-feeds.html")?.text()?;
let document = Html::parse_document(&body);
let selector = Selector::parse("div.bk-json-feeds>div.body>ul>li>a")
.map_err(|err| anyhow!("{err}"))?;

for element in document.select(&selector) {
println!("{}", element.inner_html());
}
Ok(())
}


В этой статье я хочу рассказать о своей новой библиотеке, значительно упрощающей парсинг на Rust. Приятного чтения!

https://habr.com/ru/articles/755728/

👉 @rust_lib
Regex engine internals as a library [full]

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

Если всегда было интересно, как оно там под капотом устроено, а в книге Фриддла или в книге дракона вы не нашли подробностей, то добро пожаловать - будет интересно и очень сложно.

Для понимания потребуются:

🟢Знания основ теории автоматов (знать и понимать отличия ДКА от НКА)
🟢Иметь базовое представление о том, что такое регулярные выражения
🟢Начальные знания по языку Rust
🟢Общие представления отличия различных структур данных друг от друга

https://habr.com/ru/articles/755940/

original https://blog.burntsushi.net/regex-internals/

👉 @rust_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Huey

Генерирует гифку, которая циклически перебирает все оттенки!

https://github.com/ahhhh6980/huey

👉 @rust_lib
Rust.for.Network.Programming.and.Automation.pdf
1.3 MB
Rust for Network Programming and Automation, 2nd Edition: Work around designing networks, TCP/IP protocol, packet analysis and performance monitoring using Rust 1.68
Автор: Gilbert Stew (2024)

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

👉 @rust_lib
Как я написал JVM на Rust

В последнее время я серьезно взялся за изучение языка Rust, и, как поступил бы на моем месте любой адекватный программист, после написания нескольких небольших программ я решил попробовать сделать что-то немного более амбициозное: я написал на Rust виртуальную машину Java. Не став сильно оригинальничать, я назвал ее просто rjvm. Вы можете найти ее код на GitHub.

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

⚫️дженерики
⚫️потоки
⚫️рефлексию
⚫️аннотации
⚫️I/O
⚫️just in time компилятор
⚫️интернирование строк

https://habr.com/ru/companies/otus/articles/755946/

original https://andreabergia.com/blog/2023/07/i-have-written-a-jvm-in-rust/

👉 @rust_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
Битовые поля в Rust

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

https://habr.com/ru/companies/otus/articles/845190/

👉 @rust_lib
Шпаргалка по Rust

Основные понятия

- Переменные и типы данных:
- По умолчанию переменные являются неизменяемыми. Для создания изменяемой переменной используйте mut.

let mut x = 5; // изменяемая переменная
x = 10; // корректно

- Основные типы данных:
- Целые числа: i32, u32, i64, u64, isize, usize.
- Числа с плавающей точкой: f32, f64.
- Логический тип: bool.
- Символ: char.
- Строки: String (изменяемая) и &str (неизменяемая).

- Функции:
- Определение функции:

fn имя_функции(параметры: Тип) -> Тип {
// тело функции
}

- Пример функции:

fn add(x: i32, y: i32) -> i32 {
x + y
}


- Управляющие конструкции:
- Условия:

if условие {
// код
} else if условие {
// код
} else {
// код
}

- Циклы:
- Цикл `loop`:

loop {
// бесконечный цикл
}

- Цикл `for`:

for элемент in коллекция {
// код
}

- Цикл `while`:

while условие {
// код
}


Структуры и перечисления

- Структуры:

struct ИмяСтруктуры {
поле1: Тип,
поле2: Тип,
}

Пример:

struct Point {
x: i32,
y: i32,
}


- Перечисления:

enum ИмяПеречисления {
Вариант1,
Вариант2,
}

Пример:

enum Direction {
Up,
Down,
Left,
Right,
}


Введение в владение и заимствование

- Владение: Каждый ресурс в Rust имеет единственного владельца.
- Заимствование:
- Неизменяемое заимствование:

let s = String::from("Hello");
let r = &s; // r — неизменяемая ссылка на s

- Изменяемое заимствование:

let mut s = String::from("Hello");
let r = &mut s; // r — изменяемая ссылка на s


Обработка ошибок

- Результат:

enum Result<T, E> {
Ok(T),
Err(E),
}

Пример функции с обработкой ошибок:

fn divide(x: i32, y: i32) -> Result<i32, String> {
if y == 0 {
Err(String::from("Деление на ноль"))
} else {
Ok(x / y)
}
}


- Паника:
- Используйте panic!() для критических ошибок, которые нельзя обработать.

Обобщения

- Обобщенные типы позволяют писать более универсальный код:

fn print_vector<T: std::fmt::Debug>(vec: Vec<T>) {
println!("{:?}", vec);
}


Работа с модулями

- Создание модуля:

mod имя_модуля {
pub fn функция() {
// код
}
}


- Импорт модуля:

use имя_модуля::функция;


Стандартные библиотеки

- Работа с коллекциями:
- Векторы:

let mut vec = Vec::new();
vec.push(1);
vec.push(2);


- Хэш-таблицы:

use std::collections::HashMap;

let mut map = HashMap::new();
map.insert("ключ", "значение");


Полезные команды

- Компиляция и выполнение:

cargo build # Компиляция проекта
cargo run # Запуск проекта


- Запуск тестов:

cargo test



👉 @rust_lib
Попробуйте Tauri

Хочу рассказать про один из моих любимых Opensource проектов: Tauri. Это среда для создания десктопно-мобильных приложений на JavaScript, но быстрых и легковесных. С опциональными дополнениями на Rust, а через него и на всех других языках.

Достоинства
Поддерживается Линь, Вынь и Дрюнь и всякое Ябло. EXEшник HelloWorld весит 1 мегабайт ( ну 5, если не ужиматься в угол как сирота в барском доме ). В памяти занимает на Win 11 200 Мб. (Из них >90% приходится на системные компоненты, расшаренные с другими программами. Поэтому простые средства измерения покажут 5 Мб). Кто-то считает, что это много. Покажите меньше. Только HelloWorld у нас будет такой: в верхней половине окна играет видео с вэба со звуком, а под ним кнопка закрыть, которая при наведении мыши начинает вращаться, и оба эти компонента рендерятся на GPU.

https://habr.com/ru/articles/850192/

👉 @rust_lib
This media is not supported in your browser
VIEW IN TELEGRAM
Pake

🤱🏻 Превратите любую веб-страницу в настольное приложение с помощью Rust.

Pake поддерживает Mac, Windows и Linux.

https://github.com/tw93/Pake

👉 @rust_lib
Идиоматический код на Rust для тех, кто перешел с других языков программирования

Привет, дорогие читатели! В предыдущей моей статье "Как легко перейти с Java на Rust" я делился с вами советами по переходу на Rust и уменьшению количества "потерянной крови" на этом пути. Но что делать дальше, когда вы уже перешли на Rust, и ваш код хотя бы компилируется и работает? Сегодня я хочу поделиться с вами некоторыми идеями о том, как писать идиоматический код на Rust, особенно если вы привыкли к другим языкам программирования.

https://habr.com/ru/articles/758566/

👉 @rust_lib
CloudFlare отказывается от Nginx в пользу in-house HTTP-прокси на Rust

Сегодня мы поговорим о Pingora, новом HTTP-прокси, который мы создали у себя внутри с помощью Rust. Прокси обслуживает более 1 триллиона запросов в день, форсирует производительность и предоставляет множество новых функций для клиентов Cloudflare, при этом требуя всего лишь треть ресурсов CPU и памяти нашей предыдущей прокси-инфраструктуры.

Rus https://habr.com/ru/articles/688634/

Eng https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/

👉 @rust_lib
Упрощенный пример на Rust обучения нейронной сети на основе Candle Framework от Hugging Face

Я недавно изучал примеры использования нейронных сетей из библиотеки Candle от Hugging Face и обратил внимание, что они довольно сложны для понимания людей, которые только начинают знакомство с нейросетями. Поэтому я решил написать максимально упрощенный пример кода на Rust, который демонстрирует обучение и использование простейшей нейросети.

https://habr.com/ru/articles/758658/

👉 @rust_lib
CBLT — безопасный, быстрый и минималистичный веб-сервер на языке программирования Rust

Для изучения нового языка программирования я использую следующий подход. Сначала я читаю учебник по этому языку программирования, в котором объясняются синтаксис, идиомы, философия и принципы работы языка. После этого я пишу небольшой пет-проект на этом языке программирования. На пет-проекте я немного практикуюсь с новым языком, с его стандартными библиотеками и популярными фреймворками.

Чтобы погрузиться сильнее в язык, вместо пет-проекта я начинаю писать свои библиотеки для работы с базами данных (ORM), JSON, акторами, MVC веб-фреймворком, логированием и т.д. Библиотеки, которые вряд ли будут кому-то нужны, но они помогут мне лучше понять язык программирования. На удивление, с языком Rust я добрался до написания своего веб-сервера. Раньше такого не было. Думаю, это из-за того, что Rust — это язык системного программирования и грех на нём не попробовать заняться оптимизацией перформанса.

В итоге я столкнулся с тем, что Rust не имеет аналогов Nginx, Lighttpd, Caddy, HAProxy, Apache, Tomcat, Jetty и т.д. Все эти веб-сервера написаны на C, Go, Java и т.д. Имеются только веб-фреймворки: Actix, Axum, Rocket, Hyper и т.д.

https://habr.com/ru/articles/857306/

👉 @rust_lib
Разбираем выравнивание данных и структуру памяти в Rust

Мне нравится оптимизировать код — определение и исправление неэффективных участков кода приносит некое особое чувство удовлетворения в отличие от закидывания проблемы железом. Ведь последнее — пустая трата ресурсов и выбросов углерода!

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

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

https://habr.com/ru/companies/beget/articles/856720/

👉 @rust_lib
Rust: рефакторинг для новичков

Недавно Нирадж Авинаш выложил свой код в группе по языку программирования Rust на LinkedIn. Его цель — изучить основы Rust, но я нашел его пример хорошей основой для своей статьи. Задача состоит в том, чтобы показать, как можно улучшать код на Rust поэтапно, и продемонстрировать, каких ошибок могут избегать новички, начиная с их кода. В целях упрощения, пожалуйста, не обращайте внимания на очевидные недостатки этой простой программы.

https://betterprogramming.pub/rust-refactoring-for-beginners-15a3270ce45d

👉 @rust_lib
Fuzzer Development With Rust (Basic)

Каждый исследователь должен уметь разрабатывать собственные инструменты для fuzzing (фаззинга). По этой причине я начал обучать созданию таких инструментов с нуля в рамках этого проекта, чтобы исследователи могли использовать свои фаззеры для выявления уязвимостей в области безопасности в открытых инструментах, библиотеках и коде, которые компании разрабатывают для внутреннего использования.

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

https://github.com/raminfp/fuzzer-development-with-rust

👉 @rust_lib
2025/06/16 19:46:51
Back to Top
HTML Embed Code: