Start devloping vulkan
This commit is contained in:
Vendored
+1
@@ -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
@@ -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,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>
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "token.h"
|
#include "token.hpp"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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 имя_процесса.
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user