Forwarded from Generative Anton
Там в общем в области профессионального интереса случилась штука, о которой не могу молчать. В OpenAI зарелизили Whisper — это ASR моделька, которую обучили на 680к часов (это много) и по различным тестам она достигла и в робастности и в качестве уровня человека.
Самое важное — она полностью открытая, опенсорсная и под MIT-лицензией. Такие вот дела.
По метрикам (самое важное, чем измеряется качество ASR — WER) на длинных записях там все тоже очень на уровне коммерческих сервисах, а местами и лучше.
Самое важное — она полностью открытая, опенсорсная и под MIT-лицензией. Такие вот дела.
По метрикам (самое важное, чем измеряется качество ASR — WER) на длинных записях там все тоже очень на уровне коммерческих сервисах, а местами и лучше.
👍9🤯2
Блог*
...С другой стороны, зачем ограничиваться именно u32? Наш код вполне может работать с другими типами! Давайте это исправим: macro_rules! make_literal { (($n:expr) : $ty:ty) => {{ // то же, что и было, но заменяем u32 на $ty STR: &str =…
#prog #rust #моё
Тем временем вышла версия Rust 1.64.0. Релиз я разберу подробнее чуть позже, а пока отмечу, что благодаря стабилизации core::slice::from_raw_parts я наконец-то могу переписать свой макрос, который я не трогал два года, так, чтобы он работал на стабильной версии и при этом гарантированно работал без UB. Не то чтобы он не работал раньше, но раньше он полагался на конкретный порядок указателя и длины в представлении ссылки на слайс, который, вообще говоря, мог меняться от версии к версии.
Также я воспользовался шансом и задействовал алиасы примитивных типов из core, что позволит макросу работать и в том маловероятном случае, если кто-то перекроет имя примитивного типа
Тем временем вышла версия Rust 1.64.0. Релиз я разберу подробнее чуть позже, а пока отмечу, что благодаря стабилизации core::slice::from_raw_parts я наконец-то могу переписать свой макрос, который я не трогал два года, так, чтобы он работал на стабильной версии и при этом гарантированно работал без UB. Не то чтобы он не работал раньше, но раньше он полагался на конкретный порядок указателя и длины в представлении ссылки на слайс, который, вообще говоря, мог меняться от версии к версии.
Также я воспользовался шансом и задействовал алиасы примитивных типов из core, что позволит макросу работать и в том маловероятном случае, если кто-то перекроет имя примитивного типа
usize
.blog.rust-lang.org
Announcing Rust 1.64.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
🎉5🌚4🔥1
#prog #rust #rustreleasenotes
Вышла версия Rust 1.64.0! Как всегда, отсылаю за подробностями к RELEASES.md, а тут рассказываю лишь об избранных вещах.
▪️Одновременно стабилизировали трейт IntoFuture и немного поменяли семантику
▪️В придачу к изменению выше стабилизировали std::future::poll_fn и std::task::ready!.
▪️Список типов, которые могут быть полями объединений, пополнили мутабельные ссылки и кортежи разрешённых типов.
▪️Добавили линт
▪️Как я уже писал, типы для интеропа с C (по типу
▪️Крейты в составе workspace теперь могут описывать общие зависимости на уровне самого workspace, чтобы не повторять их.
▪️У команд
▪️Ошибки в const-контексте теперь снабжаются сообщением в несовместимости с будущими версиями
▪️Стабилизировали ещё пачку API. В основном — проверяемая арифметика для
Вышла версия Rust 1.64.0! Как всегда, отсылаю за подробностями к RELEASES.md, а тут рассказываю лишь об избранных вещах.
▪️Одновременно стабилизировали трейт IntoFuture и немного поменяли семантику
.await
. Так же, как цикл for
принимает не итераторы, а всё, что может быть сконвертировано в итератор при помощи IntoIterator::into_iter
, так и .await
теперь можно использовать на всём, что может конвертироваться в футуру через вызов IntoFuture::into_future
.▪️В придачу к изменению выше стабилизировали std::future::poll_fn и std::task::ready!.
▪️Список типов, которые могут быть полями объединений, пополнили мутабельные ссылки и кортежи разрешённых типов.
▪️Добавили линт
unused_tuple_struct_fields
, который делает понятно что. Но с оговорками: по умолчанию не включён (но планируют поднять до уровня warn в будущих релизах) и не предупреждает о неиспользуемых полях типа ()
.▪️Как я уже писал, типы для интеропа с C (по типу
c_int
) переехали наконец в core
в модуль ffi
, как и Cstr
, а CString
переехал в alloc::ffi
.▪️Крейты в составе workspace теперь могут описывать общие зависимости на уровне самого workspace, чтобы не повторять их.
▪️У команд
cargo
теперь можно указывать несколько флагов --target
, чтобы скомпилировать под несколько целевых платформ сразу▪️Ошибки в const-контексте теперь снабжаются сообщением в несовместимости с будущими версиями
rustc
▪️transmute_copy
теперь паникует, если целевой тип меньше исходного.▪️Стабилизировали ещё пачку API. В основном — проверяемая арифметика для
NonZero*
-типов, но также impl std::fmt::Write for OsString и slice::from_raw_parts
в const-контексте (!!!).blog.rust-lang.org
Announcing Rust 1.64.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
👍4🔥2
Если я перестал хвалить Rust — я или умер, или попал в военкомат (что, в принципе, одно и то же)
😢33😁7🤔3
События последних дней таки догнали мою психику. Разрыдался.
И, кажется, у меня нервный тик.
И, кажется, у меня нервный тик.
😢37❤4😁2
Блог*
Сделаем слайс по частям и превратим: const DECOMPOSED: ([u8; 20], usize) = to_ascii(42); const STR: &str = unsafe { std::mem::transmute(RawSlice { ptr: &DECOMPOSED.0 as *const _, // &[u8] неявно приводится к *const [u8], …
#prog #rust #моё
"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.
Даже после точного подсчёта размера буфера
Переписал гист.
"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.
Даже после точного подсчёта размера буфера
to_ascii
возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен — LEN
! Значит, можно просто возвращать Array
и не считать len
, тем самым упростив код.Переписал гист.
👍1
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
#prog #rust
То есть, согласно miri,
Но: также согласно miri, тот же самый код, но в const-контексте,
И при этом, согласно всё тому же miri, если убрать
Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.
То есть, согласно miri,
let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это не ок, потому что тут создаётся висячая ссылка. Логично, значение, возвращаемое identity
, дохнет после вызова функции.Но: также согласно miri, тот же самый код, но в const-контексте,
const S_CONST: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это ок, тут никаких висящих ссылок нет. Потому что, тут, видимо, значение, возвращаемое константной identity
, вызвано на константном значении и потому само является константным и может быть использовано для static promotion? Даже не смотря на отсутствие на identity
атрибута #[rustc_promotable]
, поскольку возвращаемое значение не является непосредственно promotable значением и вычисляется внутри инициализатора константы?И при этом, согласно всё тому же miri, если убрать
identity
:let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts([0].as_ptr(), 1)
};
, то всё ок и никаких висячих ссылок нету? Потому что [0]
промоутится? А, нет, потому что это &[u8]
, но не &'static [u8]
, если поменять тип s_rt
, тогда miri жалуется.Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.
GitHub
const-eval/promotion.md at master · rust-lang/const-eval
home for proposals in and around compile-time function evaluation - const-eval/promotion.md at master · rust-lang/const-eval
👏2
Если растаману отрубить голову, он ещё пять минут будет говорить о преимуществах borrow checker-а
👍22😁4🌚3❤1
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце!
Ещё раз обновил гист.
Ещё раз обновил гист.
🔥1😁1
Блог*
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце! Ещё раз обновил гист.
А ещё я забыл, что ссылка на массив приводится к ссылке на слайс. Следовательно, раз у меня длина точная, мне не нужна
Обновил гист. Опять.
Ощущаю себя невероятно тупым.
std::slice::from_raw_parts
в const-контексте, а достаточно std::str::from_utf8_unchecked
, которая была стабилизирована в const-контексте ещё в Rust 1.55.0, год назад, что я сейчас и проверил только что на godbolt.Обновил гист. Опять.
Ощущаю себя невероятно тупым.
Telegram
Блог*
#prog #rust #rustreleasenotes
Новый релиз Rust — уже 1.55.0! — и мой новый разбор избранных кусков новых фич.
Теперь в качестве паттернов можно использовать диапазоны с открытой верхней границей:
match x as u32 {
0 => println!("zero!"),
1..…
Новый релиз Rust — уже 1.55.0! — и мой новый разбор избранных кусков новых фич.
Теперь в качестве паттернов можно использовать диапазоны с открытой верхней границей:
match x as u32 {
0 => println!("zero!"),
1..…
👍1😁1