Start devloping vulkan

This commit is contained in:
2026-04-29 21:08:19 +07:00
parent c02a886327
commit 1a05d3a6d9
10 changed files with 70 additions and 37 deletions
+1
View File
@@ -7,6 +7,7 @@
"args": [ "args": [
"-fdiagnostics-color=always", "-fdiagnostics-color=always",
"-g", "-g",
"-fopenmp",
"${fileDirname}/main.cpp", "${fileDirname}/main.cpp",
"${fileDirname}/Xenith/core.cpp", "${fileDirname}/Xenith/core.cpp",
"${fileDirname}/Xenith/token/token.cpp", "${fileDirname}/Xenith/token/token.cpp",
+24 -8
View File
@@ -1,6 +1,9 @@
#include "core.h" #include "core.hpp"
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
#include <omp.h>
#define MAX_CORES 16
NeuralNetwork::NeuralNetwork(LayerStructure_t layers[], int count) : numLayers(count) { NeuralNetwork::NeuralNetwork(LayerStructure_t layers[], int count) : numLayers(count) {
for (int i = 0; i < count; i++) sizes.push_back(layers[i].size); for (int i = 0; i < count; i++) sizes.push_back(layers[i].size);
@@ -39,29 +42,42 @@ std::vector<double> NeuralNetwork::feedForward(const std::vector<double>& input)
double NeuralNetwork::train(const std::vector<double>& input, const std::vector<double>& target, double lr) { double NeuralNetwork::train(const std::vector<double>& input, const std::vector<double>& target, double lr) {
std::vector<double> pred = feedForward(input); omp_set_num_threads(MAX_CORES);
std::vector<double> pred = feedForward(input);
std::vector<std::vector<double>> errors(numLayers); std::vector<std::vector<double>> errors(numLayers);
errors[numLayers - 1].resize(sizes[numLayers - 1]); errors[numLayers - 1].resize(sizes[numLayers - 1]);
double totalErr = 0; double totalErr = 0;
for (int i = 0; i < sizes[numLayers-1]; i++) {
for (int i = 0; i < sizes[numLayers - 1]; i++) {
double e = target[i] - pred[i]; double e = target[i] - pred[i];
errors[numLayers-1][i] = e * pred[i] * (1.0 - pred[i]); errors[numLayers - 1][i] = e * pred[i] * (1.0 - pred[i]);
totalErr += e * e; totalErr += e * e;
} }
for (int i = numLayers - 2; i > 0; i--) { for (int i = numLayers - 2; i > 0; i--) {
errors[i].resize(sizes[i]); errors[i].resize(sizes[i]);
#pragma omp parallel for
for (int j = 0; j < sizes[i]; j++) { for (int j = 0; j < sizes[i]; j++) {
double e = 0; double e = 0;
for (int k = 0; k < sizes[i+1]; k++) e += errors[i+1][k] * weights[i][k][j]; for (int k = 0; k < sizes[i + 1]; k++) {
e += errors[i + 1][k] * weights[i][k][j];
}
errors[i][j] = e * outputs[i][j] * (1.0 - outputs[i][j]); errors[i][j] = e * outputs[i][j] * (1.0 - outputs[i][j]);
} }
} }
for (int i = 0; i < numLayers - 1; i++) { for (int i = 0; i < numLayers - 1; i++) {
for (int j = 0; j < sizes[i+1]; j++) { #pragma omp parallel for
for (int k = 0; k < sizes[i]; k++) weights[i][j][k] += lr * errors[i+1][j] * outputs[i][k]; for (int j = 0; j < sizes[i + 1]; j++) {
biases[i][j] += lr * errors[i+1][j]; double errorTerm = lr * errors[i + 1][j];
// Вложенный цикл обновления весов
for (int k = 0; k < sizes[i]; k++) {
weights[i][j][k] += errorTerm * outputs[i][k];
}
biases[i][j] += errorTerm;
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
#ifndef CORE_H #ifndef CORE_H
#define CORE_H #define CORE_H
#include "typedef.h" #include "typedef.hpp"
#include <vector> #include <vector>
#include <cmath> #include <cmath>
+2
View File
@@ -0,0 +1,2 @@
#version 450
+1 -1
View File
@@ -1,4 +1,4 @@
#include "token.h" #include "token.hpp"
#include <algorithm> #include <algorithm>
#include <random> #include <random>
+2 -2
View File
@@ -1,8 +1,8 @@
#ifndef TYPEDEF_H #ifndef TYPEDEF_H
#define TYPEDEF_H #define TYPEDEF_H
const int MAX_CONTEXT = 8; // Сколько токенов видит сеть const int MAX_CONTEXT = 32; // Сколько токенов видит сеть
const int EMBED_DIM = 4; // Размер вектора одного токена const int EMBED_DIM = 8; // Размер вектора одного токена
const int MAX_VOCAB = 90; // Размер словаря const int MAX_VOCAB = 90; // Размер словаря
typedef enum { SIGMOID } FunctionActivate_t; typedef enum { SIGMOID } FunctionActivate_t;
+23
View File
@@ -1 +1,24 @@
[SYS]ты полезный робот помощник[USER]привет[AI]привет как дела? [SYS]ты полезный робот помощник[USER]привет[AI]привет как дела?
[SYS]ты полезный робот помощник[USER]помоги составить меню на ужин из курицы и грибов[AI]Конечно! Можно приготовить классическое фрикасе в сливочном соусе или запечь куриное филе с грибами под сырной шапкой. Что звучит аппетитнее?
[SYS]ты полезный робот помощник[USER]как в Python быстро объединить два списка без дубликатов?[AI]Используй преобразование в множество: list(set(list1) | set(list2)). Это самый быстрый и лаконичный способ.
[SYS]ты полезный робот помощник[USER]мне нужно написать короткое поздравление для коллеги с днем рождения[AI]Держи вариант: «С днем рождения! Желаю крутых проектов, неиссякаемого вдохновения и чтобы работа всегда была в радость. Ура!»
[SYS]ты полезный робот помощник[USER]почему небо синее?[AI]Это происходит из-за релеевского рассеяния: солнечный свет взаимодействует с атмосферой, и короткие волны синего цвета рассеиваются сильнее остальных.
[SYS]ты полезный робот помощник[USER]придумай три идеи для стартапа в 2024 году[AI]1. Платформа для аренды домашних инструментов через ИИ-подбор. 2. Сервис автоматизации «цифрового детокса». 3. Агрегатор экологичных локальных фермерских продуктов.
[SYS]ты полезный робот помощник[USER]что делать, если не выспался, а впереди важный день?[AI]Пей больше воды, прими контрастный душ и старайся делать самые сложные задачи в первой половине дня, пока держится остаток концентрации.
[SYS]ты полезный робот помощник[USER]напиши завязку для детективного романа[AI]«Утром на столе известного антиквара лежал предмет, который он сам лично уничтожил двадцать лет назад. Дверь была заперта изнутри, а камеры не зафиксировали ни одного движения».
[SYS]ты полезный робот помощник[USER]как правильно составить договор аренды квартиры?[AI]Обязательно укажи паспортные данные сторон, опиши состояние имущества, зафиксируй сумму залога и условия его возврата, а также приложи опись техники и мебели.
[SYS]ты полезный робот помощник[USER]составь план тренировки на 15 минут дома[AI]Начни с разминки (2 мин), затем сделай 3 круга: приседания (15 раз), отжимания (10 раз) и планка (45 сек). В конце — легкая растяжка.
[SYS]ты полезный робот помощник[USER]найди ошибку в предложении: «Он одел пальто и вышел»[AI]Ошибка в употреблении глагола. Правильно говорить «надел пальто». Запомни: одевают кого-то, а надевают на себя.
[SYS]ты полезный робот помощник[USER]в чем смысл цитаты «Я знаю, что ничего не знаю»?[AI]Это парадокс Сократа. Он означает, что чем больше человек познает мир, тем яснее он осознает масштаб того, что ему еще неизвестно.
[SYS]ты полезный робот помощник[USER]порекомендуй книгу по саморазвитию[AI]Попробуй «Атомные привычки» Джеймса Клира. Она дает конкретные инструменты, как внедрять полезные изменения в жизнь маленькими шагами.
[SYS]ты полезный робот помощник[USER]как перевести «I'm looking forward to it» на русский?[AI]Самый точный вариант: «Я с нетерпением этого жду» или «Я очень жду этого».
[SYS]ты полезный робот помощник[USER]что приготовить на завтрак за 5 минут?[AI]Овсянка в микроволновке с бананом или тост с авокадо и яйцом-пашот. Быстро, полезно и сытно!
[SYS]ты полезный робот помощник[USER]как работает блокчейн простыми словами?[AI]Это как цифровая тетрадь, записи в которой нельзя стереть или изменить. Копия этой тетради есть у каждого участника, поэтому обмануть систему невозможно.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]как сбросить кэш DNS в Windows?[AI]Запусти командную строку от имени администратора и введи: ipconfig /flushdns.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]в чем разница между TCP и UDP?[AI]TCP гарантирует доставку данных и порядок пакетов; UDP работает быстрее, но не проверяет доставку.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]почему ноутбук сильно шумит?[AI]Основные причины: запыление системы охлаждения, высыхание термопасты или высокая фоновая нагрузка на процессор.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]как проверить статус порта 8080 на Linux?[AI]Используй команду: sudo lsof -i :8080 или netstat -tuln | grep 8080.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]что такое рекурсия в программировании?[AI]Это процесс, при котором функция вызывает саму себя в своем теле до достижения базового условия.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]какой SQL-запрос удаляет таблицу?[AI]Команда: DROP TABLE название_таблицы;.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]зачем нужен Docker?[AI]Для контейнеризации приложений, обеспечивающей идентичную работу программы на любой ОС.
[SYS]ты технический эксперт, отвечай кратко и по делу[USER]как быстро найти процесс по имени и убить его в Linux?[AI]Используй: pkill имя_процесса.
Executable
BIN
View File
Binary file not shown.
+14 -23
View File
@@ -6,16 +6,15 @@
#include <sstream> #include <sstream>
#include <fstream> #include <fstream>
#include <algorithm> #include <algorithm>
#include "Xenith/core.h" #include "Xenith/core.hpp"
#include "Xenith/token/token.h" #include "Xenith/token/token.hpp"
#include <windows.h>
#include <chrono> #include <chrono>
std::string currentSystemPrompt = ""; std::string currentSystemPrompt = "";
LayerStructure_t layers[] = { LayerStructure_t layers[] = {
{MAX_CONTEXT * EMBED_DIM, SIGMOID}, {MAX_CONTEXT * EMBED_DIM, SIGMOID},
{16, SIGMOID}, {256, SIGMOID},
{MAX_VOCAB, SIGMOID} {MAX_VOCAB, SIGMOID}
}; };
@@ -71,8 +70,7 @@ void trainOnSequence(NeuralNetwork& nn, Tokenizer& tok, Embedder& emb, const std
std::cout << "Training logic: Next Token Prediction..." << std::endl; std::cout << "Training logic: Next Token Prediction..." << std::endl;
std::cout << "\033[s\033[999;1H" << "\033[2K" << "\033[1;30m" << "\033[F" << "\r" std::cout << "\033[s\n\n";
<< "DATA: " << (sequenceStr.length() > 100 ? sequenceStr.substr(0, 200) : sequenceStr) << "\033[0m\033[u";
for (int e = 1; e <= epochs; e++) { for (int e = 1; e <= epochs; e++) {
double totalLoss = 0; double totalLoss = 0;
@@ -84,26 +82,22 @@ void trainOnSequence(NeuralNetwork& nn, Tokenizer& tok, Embedder& emb, const std
trainSteps++; trainSteps++;
auto currentTime = std::chrono::high_resolution_clock::now(); auto currentTime = std::chrono::high_resolution_clock::now();
if (std::chrono::duration<double>(currentTime - startTime).count() >= 1.0) { if (std::chrono::duration<double>(currentTime - startTime).count() >= 0.1) {
stepsPerSec = trainSteps / std::chrono::duration<double>(currentTime - startTime).count(); stepsPerSec = trainSteps / std::chrono::duration<double>(currentTime - startTime).count();
trainSteps = 0; trainSteps = 0;
startTime = currentTime; startTime = currentTime;
} }
std::cout << "\rEpoch " << std::setw(4) << e << "/" << epochs std::cout << "\033[u";
<< " | Token: " << std::setw(3) << i << "/" << allTokens.size()
std::cout << "Epoch " << std::setw(4) << e << "/" << epochs
<< " | Token: " << std::setw(4) << i << "/" << allTokens.size()
<< " | Loss: " << std::fixed << std::setprecision(6) << totalLoss << " | Loss: " << std::fixed << std::setprecision(6) << totalLoss
<< " | Max Loss: " << std::fixed << std::setprecision(6) << maxLoss << " \033[s"; << " | Max Loss: " << maxLoss << "\033[K\n";
std::cout << "\033[999;1H" << "\r"; std::cout << "SPEED: " << std::setw(6) << std::fixed << std::setprecision(1) << stepsPerSec
<< " st/s | MODEL: " << std::setw(7) << modelSizeStr
std::cout << "SPEED: " << std::setw(6) << std::fixed << std::setprecision(1) << stepsPerSec << " st/s" << " | CURRENT: [" << std::left << std::setw(15) << tok.getWord(allTokens[i]) << "]"
<< " | MODEL: " << std::setw(7) << modelSizeStr << "\033[K" << std::flush;
<< " | CURRENT: [" << std::left << std::setw(15) << tok.getWord(allTokens[i]) << "] ("
<< std::right << std::setw(4) << allTokens[i] << ") ";
std::cout << "\033[K" << "\033[0m";
std::cout << "\033[997;1H" << "\r" << std::flush << "\033[u";
} }
maxLoss = totalLoss; maxLoss = totalLoss;
@@ -114,9 +108,6 @@ void trainOnSequence(NeuralNetwork& nn, Tokenizer& tok, Embedder& emb, const std
int main() { int main() {
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
Tokenizer tok; Tokenizer tok;
Embedder emb(MAX_VOCAB, EMBED_DIM); Embedder emb(MAX_VOCAB, EMBED_DIM);