Zdroj:
kernel.cuv projektuMQL5GPULibrary_LSTM.Cíl tohoto dokumentu: vytvořit praktickou „mapu“ všech zásadních funkcí, jejich parametrů, datových toků a návratových hodnot – od CUDA kernelů přes vrstvy modelu až po exportované DLL API (
DN_*) pro MQL5.
- Celý soubor používá column-major rozložení (nativní pro cuBLAS).
- Vzorec indexace: prvek
(i, j)je nabase[i + j * rows]. - V dokumentaci níže jsou rozměry zapisovány jako
[rows x cols].
MQL_BOOL(int) – logický návrat pro DLL API (MQL_TRUE=1,MQL_FALSE=0).TrainingState:TS_IDLE = 0TS_TRAINING = 1TS_COMPLETED = 2TS_ERROR = -1
Účel: uloží poslední chybové hlášení do globálního g_last_err_w (thread-safe přes mutex).
Parametry:
fmt: formátovací řetězec (wide char)....: variadické argumenty jako uprintf.
Poznámka: volaná z CUDA_CHECK_*, CUBLAS_CHECK_*, CURAND_CHECK_* maker i z logiky tříd.
Účel: zaokrouhlí n na nejbližší sudé číslo nahoru.
Parametry:
n: vstupní velikost.
Návrat: sudé size_t.
Účel: bezpečný převod na unsigned s saturací na UINT_MAX.
Parametry:
v: vstupní velikost.
Návrat: unsigned.
Wrapper nad cudaMalloc/cudaFree s evidencí count/capacity.
- Alokuje/resize GPU buffer na
nprvků typuT. - Reuse, pokud
n <= capacity.
Parametry:
n: počet prvků (ne bajtů).
Návrat:
MQL_TRUE: alokace/resize OK.MQL_FALSE: chyba (typicky OOM; vyplní globální error stav).
- Synchronní nulování celého aktivního bufferu (
count*sizeof(T)).
- Asynchronní nulování v proudu
s.
Parametry:
s: CUDA stream, kde běží memset.
- Uvolní alokaci (
cudaFree), resetuje metadata.
- Vrací aktivní velikost v bajtech (
count*sizeof(T)).
Per-thread GPU kontext (stream + cuBLAS + cuRAND).
Parametry:
device: CUDA device index.
Co dělá:
cudaSetDevicecudaStreamCreateWithFlags(..., cudaStreamNonBlocking)cublasCreate + cublasSetStreamcurandCreateGenerator + seed + curandSetStream
- Bezpečné zrušení
curand,cublas, streamu.
Sada atomických polí pro online reporting.
- Reset všech counters a metrik na výchozí hodnoty.
- Aktualizuje elapsed/ETA podle
progress_pcta času od startu.
- Warp-level sum redukce přes
__shfl_down_sync.
- Device sigmoid:
1 / (1 + exp(-x)).
Níže je každá kernel funkce z kernel.cu se semantics parametrů.
Účel: převod double -> float vektorově po 4, grid-stride loop.
Parametry:
n: počet prvků.in: vstupní pole (double, délkan).out: výstupní pole (float, délkan).
Stejné jako výše, opačný směr float -> double.
(int hidden_size, int batch,
const float* gates_raw, const float* c_prev,
float* c_new, float* h_new,
float* f_cache, float* i_cache, float* g_cache, float* o_cache)Účel: z preaktivací gate spočítá f,i,g,o, nový cell state c_new a hidden state h_new.
Parametry:
hidden_size: počet neuronů v hidden stavu.batch: mini-batch size.gates_raw: sloučené preaktivace 4 bran ([4H x B]v major uspořádání podle implementace).c_prev: předchozí cell state[H x B].c_new: nový cell state[H x B].h_new: nový hidden state[H x B].f_cache/i_cache/g_cache/o_cache: cache aktivací pro backward.
(int hidden_size, int batch,
const float* dh, const float* dc_next,
const float* c_prev, const float* c_cur,
const float* f_cache, const float* i_cache,
const float* g_cache, const float* o_cache,
float* dc_prev_out, float* dgates_raw)Účel: spočítá gradienty LSTM bran + dc_prev.
Parametry navíc:
dh: gradient z hidden větve pro aktuální čas.dc_next: gradient cell state z budoucího času.c_cur: aktuálníc_t.dc_prev_out: gradient doc_{t-1}.dgates_raw: gradienty preaktivací všech 4 bran.
(int hidden_size, int batch,
const float* zr_raw, const float* nx_raw, const float* nh_raw,
const float* h_prev,
float* h_new,
float* z_cache, float* r_cache, float* n_cache, float* nh_cache)Účel: GRU forward: výpočet z, r, kandidáta n a h_new.
(int hidden_size, int batch,
const float* dh,
const float* z_cache, const float* r_cache,
const float* n_cache, const float* nh_cache,
const float* h_prev,
float* dh_prev_direct,
float* dz_raw, float* dr_raw, float* dnx_raw, float* dnh_raw)Účel: GRU backward pro lokální derivace a větvení gradientu.
kRNNForward(int hidden_size, int batch, const float* preact, float* h_new)
h_new = tanh(preact).
kRNNBackward(int hidden_size, int batch, const float* dh, const float* h_cur, float* dpreact)
dpreact = dh * (1 - h^2).
- Přičte bias po řádcích:
A[row + col*rows] += bias[row].
kConcatHX(int hidden_size, int input_size, int batch, const float* h_prev, const float* x, float* hx)
- Slepí
[h_prev; x]dohxpro gate GEMM.
kSplitDHX(int hidden_size, int input_size, int batch, const float* dhx, float* dh_prev, float* dx)
- Rozdělí gradient z concatenace zpět na
dh_prevadx. dh_prev/dxmohou býtnullptr(podle potřeby větve).
- Funkčně ekvivalentní
kAddBiasInplace; používá se pro lineární output.
dst[i] += src[i].
- Gradient MSE:
d = 2*(y - t)/n.
- Redukuje součet kvadratické chyby
sum((y-t)^2)doout_sum.
- Redukuje
sum(buf^2)pro L2 norm diagnostiku/clipping.
(int n, float* p, float* m, float* v,
const float* g,
float lr, float b1, float b2, float eps,
float wd, float c1, float c2, float clip_val)Účel: update parametrů AdamW (s bias-correction přes c1/c2).
Parametry:
p: parametry.m,v: 1. a 2. moment.g: gradient.lr: learning rate.b1,b2: decay momentů.eps: numerická stabilita.wd: weight decay.c1,c2: bias-correction koeficienty.clip_val: v kódu nepoužito (globální clipping se řeší jinde).
- Uniformní škálování gradientů (globální norm clipping).
kGatherTimesteps(int hidden_size, int batch, int seq_len, float* dst, const float* const* src_ptrs)
- Sbalí timestep buffery (i ne-kontiguální) do jednoho contiguous bloku.
- Inverted dropout: zachované prvky škáluje
1/(1-drop_rate), ostatní nulují.
- Backward přes stejnou masku + inverted scaling.
- Převod z
[batch, seq, feat]do timestep-major layoutu používaného vrstvami.
kGatherTransposeSeq(int mb_size, int seq_len, int feat, const int* indices, const float* src, float* dst)
- Gather z globálního datasetu podle mini-batch indexů + současná transpozice do timestep-major.
- Gather řádků (
indices[b]) ze zdroje do minibatch bufferu.
- Block-level min/max reduce (256 vláken/blok), mezivýstup po blocích.
RNN,GRU,LSTM,ATTENTION.
Forward(...)Backward(...)Update(...)SaveBest()/RestoreBest()GetOutputH(...)GetInputSize(),GetHiddenSize(),GetDropoutRate(),GetType(),GetGateDim()Init(...),InitFromData(...),FreeAll()
- Parametry:
W,b. - AdamW state:
mW,vW,mb,vb. - Gradienty:
dW,db. - Snapshot:
W_best,b_best. - Cache (časové kroky):
hx_cache,f/i/g/o_cache,c_cache,h_cache. - Dropout:
dropout_mask,dropout_mask_valid,h_drop_cache,dropout_rand.
- Alokace všech parametrů.
- Inicializace vah Gauss (
stddev ~ sqrt(2/(concat+gate_dim))). - Bias: forget gate přednastaven na
1.0.
- Alokuje struktury bez náhodné inicializace vah (následně se typicky nahrávají serializovaná data).
Klíčové parametry:
X: vstup v timestep-major formátu.seq_len,batch.training: zapnutí dropout větve.curand_gen: generátor random pro dropout masky.
dh_last: gradient ze ztráty do posledního kroku vrstvy.dh_above_seq: gradient ze „shora“ (další vrstva) pro všechny kroky.ones_ptr: pomocný vektor jedniček (např. pro bias GEMV/GEMM postupy).
- AdamW update parametrů vrstvy.
- Snapshot a rollback nejlepších vah.
Metodicky stejné API jako LSTMLayer, ale vnitřní gate logika je GRU (z, r, n) a odpovídající cache buffery.
Nejjednodušší rekurentní varianta (tanh), stejné lifecycle API (Init/Forward/Backward/Update/Snapshot).
- V souboru je definovaný základ, ale attention není hlavní produkční výpočetní větev jako LSTM/GRU/RNN.
Init(int in_d, int out_d)– alokace + random init.InitFromData(int in_d, int out_d)– alokace bez random init.Forward(cublasHandle_t, cudaStream_t, const float* H, float* Y, int batch)– lineární projekce.Backward(cublasHandle_t, cudaStream_t, const float* dY, const float* H, float* dH, int batch)– gradienty output vrstvy.Update(float lr, float c1, float c2, float wd, float clip, cudaStream_t)– AdamW update.SaveBest()/RestoreBest()– snapshot management.
Důležité parametry:
H: vstup hidden representation[in_dim x batch].Y: predikce[out_dim x batch].dY,dH: gradienty output/input.
virtual float GetLR(int step, float base_lr) const = 0;
- Dynamické LR s warmup + cosine decay.
Parametry GetLR:
step: aktuální trénovací krok.base_lr: základní LR.
Třída spravuje:
- vektor rekurentních vrstev,
- output vrstvu,
- trénink/predikci,
- progress reporting,
- async thread lifecycle,
- serializaci stavu modelu.
SetGradClip(float v)– nastaví globální norm clipping.SetSequenceLength(int sl)– min. 1.SetMiniBatchSize(int mbs)– min. 1.AddLayer(...)/AddGRULayer(...)/AddRNNLayer(...)– přidání vrstev.SetOutputLayer(int out_dim)– output projekce.
LoadBatch(const double* X, const double* T, int batch, int in, int out, int l)- nahraje a převede trénovací data do GPU bufferů.
PredictBatch(const double* X, double* Y, int batch, int in, int out, int l)- jednorázová inference batch vstupu.
Train(int epochs, double lr, double b1, double b2, double eps, double wd, int patience)TrainAsync(...)StopTraining()
GetStatus(),GetResult(...)GetProgress*()family (epoch, minibatch, LR, MSE, best MSE, grad norm, ETA...)GetLayerCount(),GetLayerWeightNorm(...),GetGradNorm()
SnapshotWeights(),RestoreWeights()SaveState(),GetState(...),LoadState(...)
g_nets: map<int, shared_ptr<SequenceModel>>.g_id: generátor handle ID.- Synchronizace přes
g_map_mtx.
Pomocné funkce:
FindAndLockExclusive(int h, std::unique_lock<std::shared_mutex>& lk)FindNetNoLock(int h)ComputeDeviceL2Norm(cudaStream_t, const float* buf, int n)
Následující funkce jsou externě volatelné z MQL5.
- Vytvoří
SequenceModel, vrátí handle (>0) nebo0při chybě.
- Uvolní model pro daný handle.
- Nastavení délky sekvence.
- Nastavení velikosti minibatche.
- Přidání vrstvy (default LSTM branch dle interní logiky).
Parametry:
h: handle modelu.in: vstupní dimenze vrstvy.out: hidden dimenze vrstvy.act: identifikátor typu/aktivace (v implementaci se mapuje na typ vrstvy).drop: dropout rate (0..1).
- Přidá GRU vrstvu.
- Přidá simple RNN vrstvu.
- Nastaví globální gradient clipping.
- Nastaví výstupní dimenzi lineární hlavy.
- Nahraje trénovací batch (
X,T) a metadata dimenzí.
- Predikce bez tréninku.
- Uloží snapshot aktuálních vah.
- Obnoví poslední snapshot.
MQL_BOOL DN_Train(int h, int epochs, double lr, double b1, double b2, double eps, double wd, int patience)
- Blokující trénink.
MQL_BOOL DN_TrainAsync(int h, int epochs, double lr, double b1, double b2, double eps, double wd, int patience)
- Neblokující trénink na background vlákně.
- Vrací
TrainingState(-1/0/1/2).
- Vrátí agregovaný výsledek tréninku.
- Nastaví stop flag (graceful stop).
Jednotlivé getters:
DN_GetProgressEpochDN_GetProgressTotalEpochsDN_GetProgressMiniBatchDN_GetProgressTotalMiniBatchesDN_GetProgressLRDN_GetProgressMSEDN_GetProgressBestMSEDN_GetProgressGradNormDN_GetProgressTotalStepsDN_GetProgressPercentDN_GetProgressElapsedSecDN_GetProgressETASec
Vrací vše v jednom volání přes ukazatele:
(int h,
int* out_epoch, int* out_total_epochs,
int* out_mb, int* out_total_mb,
double* out_lr, double* out_mse, double* out_best_mse,
double* out_grad_norm, double* out_pct,
double* out_elapsed_sec, double* out_eta_sec)- Počet vrstev + output layer.
- L2 norma vah vybrané vrstvy.
- Celková gradientová norma.
- Serializuje stav modelu interně (do string bufferu v objektu).
- Zkopíruje serializovaný stav do volajícího bufferu.
- Deserializuje stav modelu ze stringu.
- Vrátí poslední wide-char chybovou zprávu (zkrácenou na
len).
- Volat vždy v pořadí:
DN_Create -> konfigurace vrstev -> DN_SetOutputDim -> DN_LoadBatch. - Dimenze
in/out/l/seq_lenmusí odpovídat fyzickému layoutu dat v MQL5. - Při async tréninku pravidelně pollovat
DN_GetTrainingStatus+DN_GetProgressAll. - Před shutdown volat
DN_StopTraining(pokud běží async) a následněDN_Free. - Po chybě číst
DN_GetErrorkvůli diagnostice CUDA/cuBLAS/cuRAND.
- Kernely pro data:
kCopy*,kTransposeToTimestep,kGather*. - Kernely pro recurrent math:
kLSTMGates*,kGRUGates*,kRNN*. - Kernely pro trénink:
kMSEGrad,kMSEReduceWarp,kL2NormReduceWarp,kScaleGradients,kAdamW. - Externí API:
DN_*(create/free/config/load/predict/train/progress/state/error).
Tento soubor je navržen jako „single source of truth“ pro vývojáře MQL5 i C++/CUDA integraci.