LINUX.ORG.RU

Сообщения xionovermazes

 

nevermind-neu библиотека машинного обучения

Доброго времени суток, публикую свою разработку, а именно библиотеку машинного обучения nevermind-neu. Идея изначально появилась из желания хорошо понять как работают нейронные сети и изучить rust, а для того чтобы понять, лично мне нужно написать самому. Далее вся эта разработка затянула меня и вышло в то что вышло. Кратко опишу текущие возможности библиотеки:

  • Слои: полносвязный, пока что 1 :(
  • Функции потерь: Эвклидова потеря, Кросс-энтропия(softmax loss).
  • Функции активации: relu, sigmoid, tanh, leaky_relu
  • Стандартные оптимизаторы: Adam, RMSProp, AdaGrad, AdaDelta
  • Асинхронная паралельная подготовка батчей
  • Датасет лоадеры: CSV, Protobuf
  • Сериализация состояния модели нейронной сети: protobuf (позже numpy добавлю)
  • Сериализация конфигурации модели нейронной сети: yaml
  • Поддержка OpenCL вычислений, используя ocl crate
  • Так называемая утилита tool (нужно что-то придумать с названием), который позволяет обучать модели(с нескучным cli интерфейсом), тестировать их, создавать конфигурации моделей в cli режиме.

В качестве библиотеки матричной математики на CPU используется ndarray, который использует matrixmultiply , который под капотом использует simd ядра для умножения матриц. Для OpenCL написал собственные ядра. Я сравнивал свою библиотеку на mnist датасете с достаточно популярной dfdx и она конечно же оказалась быстрее процентов на 60%. Знаю, что она не так много использует Rc-RefCell, но думаю, что основная «загвоздка» производительности не в этом. С другими либами на расте не сравнивал, поскольку отсутствовал example с mnist и др. датасетами. В ближайшее время буду делать паралельное оптимизирование параметров и искать некоторый консенсус когда использовать параллельные итераторы, а когда нет, поскольку производительность сильно падает при их использовании на маленьких слоях(< 64 нейронов).

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

В качестве приложения также сделал небольшой проектик-пример предоставляющий возможность на основе библиотеки создать своего шахматного бота из датасетов lichess. Инструкции чтобы обучить и сыграть указаны по ссылке . Если возникнут трудности то отпишите - постараюсь помочь. Обучить можно как с использованием OpenCL, так и без. Натренированные модели для белых и черных можно скачать тут внизу страницы.

Гитхаб репа

MNIST example

 , , ,

xionovermazes
()

Вопрос по rust

Доброго времени суток,

Код-сниппет : https://pastebin.com/28JGG03C .

Проблема : Есть три структуры Databatch, Dataloader, Reactor. Реактор содержит загрузчик данных, а загрузчик данных возвращает один из &Databatch.

На 44 строчке ошибка :

cannot borrow `*self` as mutable more than once at a time
  --> src/main.rs:44:9 

Вопрос : Как мне переделать архитектуру или часть кода, чтобы реализовать задуманное?

Мне помогло :

  1. Сделать что бы метод next() возвращал Databatch, а не &Databatch
  2. И соответственно вызов .clone() на каждый next()

Но мне не нравится это решение так как происходит лишнее копирование.

 

xionovermazes
()

Ещё один вопрос по generics в раст

Добрый день,

Есть один вопрос, который я задавал на stackoverflow (https://stackoverflow.com/questions/70758445/nested-generics-arguments-in-struct-rust),

но не получил внятного ответа. Первый ответ был «неправильное использование дженериков», а другой "T - конкретный тип, и T : io::Write - недостачно. Первый ответ, конечно достаточно внятный, но всё же хотелось понять почему.

Я написал небольшой гист - где по-моему аналогичная идея вполне себе компилируется и работает : https://gist.github.com/xxxxxion/ba438aedef23091256624dc84c44dff7 .

============== [ Дублирую вопрос - перевёл гугл ] ==============

я пишу программу, которая использует текстовый пользовательский интерфейс, и я перенес функциональность TUI в отдельный модуль, который содержит структуру с логикой/переменными TUI.

Объявление структуры:

struct App<'a, T: io::Write>
where
    T: io::Write,
{
    items_left: StatefulList<String>,
    items_right: StatefulList<String>,
    input_mode: InputMode,
    parser: &'a parser::Parser,
    // --- [ Tui Backend ] ---
    backend: TermionBackend<T>,
}

and the constructor function implementation is :

impl<'a, T> App<'a, T>
where
    T: io::Write,
{
    fn new(parser: &'a parser::Parser) -> App<'a, T> {
        let stdout = io::stdout().into_raw_mode().unwrap();
        let stdout = MouseTerminal::from(stdout);
        let stdout = AlternateScreen::from(stdout);
        let backend = TermionBackend::new(stdout);
        let mut terminal = Terminal::new(backend).unwrap();
        let events = Events::new();

        App {
            items_left: StatefulList::with_items(vec![]),
            items_right: StatefulList::with_items(vec![]),
            input_mode: InputMode::Normal,
            parser,
            backend,
        }
}

Но я получил ошибку от rust-analyzer :

mismatched types expected struct TermionBackend<T> found struct TermionBackend<AlternateScreen<MouseTerminal<RawTerminal<Stdout>>>>>

Я хочу использовать дженерики, потому что в TermionBackend много вложенных классов, а его объявление очень большое.

Также я почитал исходник и структура AlternateScreen, то есть T, реализует io::Write типаж, и поэтому я не понимаю, почему возникает ошибка.

============== [ Дублирую вопрос - перевёл гугл ] ==============

Также сейчас немного поменял декларацию на

let backend: TermionBackend<T> = TermionBackend::new(stdout);

И rust-analyzer ругается :

mismatched types expected type parameter T found struct AlternateScreen<MouseTerminal<RawTerminal<Stdout>>>

Опять же AlternateScreen реализует trait io::Write.

 ,

xionovermazes
()

Вопрос по Rust (Option + Rc + RefCell)

Доброго времени суток,

Программируя небольшую игрулечку на piston+rapier2d, создал класс героя(Hero) :

pub struct Hero {
    pub rotation: f64,
    pub health: f32,
    pub texture: Texture,
    step_size: f64,
    // --- [ Physics ] --- //
    body_handle: Option<RigidBodyHandle>,
    rigid_body_set: Option<Rc<RefCell<RigidBodySet>>>,
    collider_set: Option<Rc<RefCell<ColliderSet>>>,
}


Три последние члена класса задаются через функцию trait-a PhysicalObject - init_with_physics(…).

Вопрос у меня в том правильно ли я всё делаю, меня смущает синтаксическая «огромность» при доступе к этим трём членам класса. В частности, когда использую Option<Rc<RefCell<…>>>

Например что бы получить rigid_body_set :

let rigid_set_rc = self.rigid_body_set.clone().unwrap();
let mut rigid_set = rigid_set_rc.borrow_mut();

В одну строчку это сделать не получилось - rust-analyzer ругается :

temporary value dropped while borrowed consider using a let >binding to create a longer lived value

Также как понимаю при unwrap(), объект внутри option перемещается, поэтому приходится clone() использовать. Правильно ли это? Или есть другие подходы представлять в struct неинициализированные данные, которые могут быть позже заданы.

 ,

xionovermazes
()

Пропала прозрачность окна в sakura после обновления арча.

Доброго времени суток, после обновления арча пропала прозрачность при запуске окна терминала. Хотя в конфигурационном файле и в гуевой конфигурации прозрачность стоит. Также если вручную зайти в запущенном терминале в настройки и применить те же самые (с прозрачностью - окно становится прозрачным.

композитор : compton

~/.config/sakura/sakura.conf :

[sakura]
colorset1_fore=rgb(238,238,236)
colorset1_back=rgba(36,40,50,0.92)
colorset1_curs=rgb(255,255,255)
colorset1_key=F1
colorset2_fore=rgb(255,120,0)
colorset2_back=rgba(0,0,0,0.9)
colorset2_curs=rgb(255,255,255)
colorset2_key=F2
colorset3_fore=rgb(192,192,192)
colorset3_back=rgb(0,0,0)
colorset3_curs=rgb(255,255,255)
colorset3_key=F3
colorset4_fore=rgb(192,192,192)
colorset4_back=rgb(0,0,0)
colorset4_curs=rgb(255,255,255)
colorset4_key=F4
colorset5_fore=rgb(192,192,192)
colorset5_back=rgb(0,0,0)
colorset5_curs=rgb(255,255,255)
colorset5_key=F5
colorset6_fore=rgb(192,192,192)
colorset6_back=rgb(0,0,0)
colorset6_curs=rgb(255,255,255)
colorset6_key=F6
last_colorset=1
scroll_lines=4096
font=JetBrains Mono 11
show_always_first_tab=No
scrollbar=false
closebutton=true
tabs_on_bottom=false
less_questions=false
disable_numbered_tabswitch=false
use_fading=false
scrollable_tabs=true
urgent_bell=Yes
audible_bell=No
blinking_cursor=No
stop_tab_cycling_at_end_tabs=No
allow_bold=No
cursor_type=2
word_chars=-,./?%&#_~:
palette=1
add_tab_accelerator=5
del_tab_accelerator=5
switch_tab_accelerator=4
move_tab_accelerator=5
copy_accelerator=5
scrollbar_accelerator=5
open_url_accelerator=5
font_size_accelerator=4
set_tab_name_accelerator=5
search_accelerator=5
add_tab_key=T
del_tab_key=W
prev_tab_key=Left
next_tab_key=Right
copy_key=C
paste_key=V
scrollbar_key=S
set_tab_name_key=N
search_key=F
increase_font_size_key=plus
decrease_font_size_key=minus
fullscreen_key=F11
set_colorset_accelerator=5
icon_file=terminal-tango.svg
colorset1_scheme=0
colorset2_scheme=0
colorset3_scheme=1
colorset4_scheme=1
colorset5_scheme=1
colorset6_scheme=1
copy_on_select=false
paste_button=2
menu_button=3

 ,

xionovermazes
()

postfix + dovecot + rainloop настройка внешней почты.

Доброго времени суток.

Настраивал почту по гайду : http://rus-linux.net/MyLDP/server/install-postfix-mail-server.html на debian 10.

Локально почта вроде ходит. Но когда пытаюсь написать на gmail почту через web rainloop : выдает ошибку «authentication failed» См скриншот (https://imgur.com/a/MQAADl8)

В конце гайда в принципе написано, что эта конфигурация только для локальной почты.

Вопрос - что нужно сделать что бы почта могла ходить на публичные емейлы и соответственно принимать или можно гайд скинуть rus/eng.

Спасибо.

 , ,

xionovermazes
()

arch + openbox поломался после обновления

Привет,

Не обновлял арч в течении двух недель. Обновил. Знаю, что обновлялись драйвера nvidia.

Проблема : добавилась прозрачность к неактивным окнам. См скриншот. https://imgur.com/a/aJpzE0W

Дело не в theme опенбокса, менял на некоторые стандартные - не помогло.

 ,

xionovermazes
()

BiPlanes Revival

BiPlanes Revival - это ремейк старой игры для мобильных телефонов. Доступна для Linux/Windows. Есть возможность играть по сети как для Direct Connect, когда есть белый айпи, а также реализован матчмейкинг через NAT Hole Punching (не работает для symmetric NAT ). Графика SDL2.

Отрывок с сайта :

Features:

  • Crossplatform

  • Easy matchmaking using peer-to-peer connection

  • Play with your friend using secret password

  • Easy to learn, hard to master gameplay

  • Hardcore mode: one-shot kills + more clouds for cover

  • Automated statistics system keeps track of your efficiency

  • Sounds and sprites can be modded

Изначально проект делался в целях изучения SDL2 и сокетного сетевого програмирования, но решили допилить до в какой-то мере играбельного результата. Пароль в матчмейкинге работает как namespace для P2P соединений, т.е. чтобы с другом поиграть нужно ввести одинаковый пароль.

Сайт : https://regular-dev.org/biplanes-revival

На сайте скриншоты и видео с геймплеем + ссылка на скачивание AppImage

Cкомпилировать из сорцов : https://github.com/regular-dev/biplanes-revival

 , ,

xionovermazes
()

TCP based multichannel library/protocol

Доброго времени суток,

Ищу Сабж. Сабж также должен быть :

  • Кроссплатформенный (Linux / Windows хотябы)
  • Открытый исходный код.
  • Написан на C/C++.
  • Уметь в несколько каналов паралельной передачи передачи.

Большой плюс, если эта библиотека сможет в передачу файлов через API уровня s.sendFile(«/path/file.txt»).

Также хорошо, если написана на boost::asio.

Видел SCTP, но о нём мало после 2010 что то видно. Да и не TCP это.

Посоветуйте что-нибудь…

 , ,

xionovermazes
()

Sciter rust-binding dom example не загружает html с внешних ресурсов

Добрый день.

Недавно начал изучать Rust и вот мне очень нравится писать простенькие интерфейсы. Выбрал для себя sciter.

Собственно пытаюсь скомпилировать dom example. (https://github.com/sciter-sdk/rust-sciter/blob/master/examples/dom.rs)

Все скомпилировалось - запускаю - белое окно.

Далее я просто скопировал исходный код url в файл (http://httpbin.org/html) и поменял функцию c load_file на load_html :

let html = include_bytes!("minimal.htm");
frame.load_html(html, Some("example://minimal.htm"));

Заработало - Т.е. из памяти он отображает html контент. Пробовал запускать с root - тоже самое. Интернет на хосте есть, сайт пингует. Писал на форум sciter - там три дня пост на модерации уже. помогите пожалусто!!!

 , ,

xionovermazes
()

Uinput передвижение мыши

Привет,

Мне нужно написать функции, которые двигают курсор, кликают мышкой. До некоторого момента, реализовывал это через Xtst, X11 - работало. Сейчас на ноутбуке имею Debian с Wayland и соотвественно работать перестало. Нашел решение в виде uinput. Набросал пару функции. И тут в чем особенность поведения - он один раз , ПЕРВЫЙ, передвинул. Под первым имею в виду первую запись в дескриптор uinput. Потом перестает. Клики мышки также работают, но только один раз.

Вот код : https://pastebin.com/zF5KKTVC

Захостил на всякий случай сдесь, может пригодиться кому.

https://gist.github.com/regular-dev/7a214f8b52911a63afe803693d467863

Помогите люди добрые !

 , ,

xionovermazes
()

OpenVPN Debian 9 server problem

Привет,

Поднимаю TLS-openvpn на debian 9 по этому гайду https://wiki.debian.org/OpenVPN.

Что я ввел :

1) apt-get install openvpn
2) apt-get install easy-rsa
3) make-cadir easy-rsa
4) cd easy-rsa  
5) ln -s openssl-1.0.0.cnf openssl.cnf
6) chmod +x vars
7) sudo ./vars
8) sudo ./build-ca

Вот на восьмом шаге в гайде написано : It will generate ca.crt and ca.key in /etc/openvpn/easy-rsa/keys/ directory.

У меня никаких ключей не сгененрировалось в этой папке не воявилось.

Some output :

 
sudo ./vars  
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
root@s169731:/etc/openvpn/easy-rsa# sudo ./clean-all 
Please source the vars script first (i.e. "source ./vars")
Make sure you have edited it to reflect your configuration.
sudo ./build-ca 
  Please edit the vars script to reflect your configuration,
  then source it with "source ./vars".
  Next, to start with a fresh PKI configuration and to delete any
  previous certificates and keys, run "./clean-all".
  Finally, you can run this tool (pkitool) to build certificates/keys.

 ,

xionovermazes
()

Rails RefineryCMS - iframe tag (embed youtube)

Приветик,

Хочу вставить youtube видео на сайт под управлением rails 5.1.7 refinnery cms -> 4.0

Значит вставляю через редактор постов html code (вставляю в html edit mode)

<iframe title="YouTube video player" class="youtube-player" width="450" height="364" src="https://www.youtube.com/embed/mIgMNh6gGXs" frameborder="0">
</iframe>

Вот и ничего не вставляется (но если сразу же в превьюхе переключится то видео есть(см. скриншот). Искал в интернет решения - вроде как default rails security feature. Собственнно что бы решить вот эти сточки в config/environments/development.rb :

config.action_dispatch.default_headers = {
     'X-Frame-Options' => 'ALLOWALL'
         }

         config.action_view.sanitized_allowed_tags = %w( iframe )
         config.action_view.sanitized_allowed_attributes = %w( src width height frameborder webkitAllowFullScreen mozallowfullscreen allowFullScreen )

Вот, все равно тоже самое.

https://imgur.com/a/BbU9CXq

Два скриншота. На одном то как видео отображается в превьюхе и второе как iframe красным в логах выдается. запускаю сервер :

bundler exec rails s -b 0.0.0.0

 

xionovermazes
()

Отображение только текущей папки в терминале

Приветик, Проблема такая , вот допустим я ввел в терминал :

cd /some/folder/some/path

Ну и соотвественно в терминале будет длинная строчка всегда :

name@turbohost:~/Documents/some/folder/some/path$

Я хочу что бы отоброжалась только current folder :

name@turbohost: path$ - типо того. Потому как pwd я всегда могу ввести.

У меня такая настройка по дефолту из коробки в федоре стояла, но я незнаю как это сделать на своем дебиане, хотя на обоих gnome3.

 , ,

xionovermazes
()

Белый IP - vps services

Правильно я понимаю, что при покупке VPS сервиса ну например типичный : рег.ру или интерсервер.нет (абсолютно точно не реклама), я получаю белый айпишник, на котором могу слушать подключения на сокетах, или там как то подругому? (просто там не написано про это, написано только про тех характеристики и т д .)

 , ,

xionovermazes
()

Mouse handle with keyboard

Привет лор,

Знаете ли какие-то тулзы, что бы управлять мышкой, с помощью клавиатуры : Numpad-стрелочки + например '+' - ЛКМ.

Погуглил, - ничего дельного не нашел (может плохо гуглил)

Gnome/Debian

 , ,

xionovermazes
()

Debian запуск графических приложений от имени администратора.

Пишу программку на qt, там использую raw socket (boost::asio::icmp::socket ... ). Соотвественно для запуска нужны sudo права (выдает permission denied на open).

Ну пробовал sudo-й : выдал такое : No protocol specified qt.qpa.xcb: could not connect to display :0 .... . Также он, например sudo-й не запускает, любые гуевые приложения, потмоу что неможет к xorg server присоединиться на руте. консольные приложения запускает через sudo. стоит gnome3 + debian 10. Так вот, что мне делать ?

 , ,

xionovermazes
()

C++ Массив из указателей на другой массив или что-то вроде того.

Вообщем есть допустим двойной массив чисел. Есть двойной указатель или как это, (две звездочки), вот и нужно что бы эти две звездочки полностью указывали на вот этот вот массив чисел. Для одномерного я эту задачу решил : (https://pastebin.com/vzHWbCuu). Вообщем что я делаю не так, help m3!!

 ,

xionovermazes
()

OpenCL использование host memory

https://pastebin.com/ahYUeUcE - вот это мой турбо-код. Значит вот допустим появиться у меня класс(1), который содержит вектор int, ну и в нем еще вектор классов(2) которые тоже содержат в себе вектор int-ов. Ну и вообщем этих классов(1) миллион допустим. И нужно что-нибудь сосчитать. Используя вектор класса(2) и вектор класса(1). Я это к чему,,, к тому что память мне неудобно копировать. Хочу значет просто ссылку на массив из объектов. Тобеш не копировать в память GPU, а чтоби GPU использовала host(RAM(если не ошибаюсь) память. Плохая ли затея? Нету ли у кого примера как это делать, или хотя бы отрывок кода.

Я даже что-то нашел

https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateBuffer...

«Yes, use clCreateBuffer with flags containing one of:

CL_MEM_USE_HOST_PTR CL_MEM_ALLOC_HOST_PTR »

НО я поменял как бы на аргумент на CL_MEM_USE_HOST_PTR , ну и там полились ошибки, я даже догадываюсь почему, но исправить и сделать как нужно не понимаю, томушо новичок в OpenCL.

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

 , ,

xionovermazes
()

Количество доступных потоков pthread

Как узнать максимальное количество доступных для использования потоков в C++(pthread).

 , ,

xionovermazes
()

RSS подписка на новые темы