ПОПЕРЕДЖЕННЯ: ТАКІ ПОСТА, ЯКІ ВАЖЛИВІ.
Це, ймовірно, багато з того, що нижче не спрацює, я генерую їх як як як як як-до мене, а потім роблю всі кроки і отримати зразок додатку працює... ви були підступні і бачили їх! вони ймовірно будуть готові до середини грудня.
## Вступ
Ласкаво просимо в Другу частинуЧастина 1
Ми виклали бачення створення асистента з письма, який використовує ваш блог як ґрунт для знань, наприклад, як адвокати використовують LLM, вивчений на судовому розгляді, щоб розшифровувати документи.
**Пора запачкать наши руки базой: убедиться, что ваш спецназ готов к работникам.**ЗАУВАЖЕННЯ: це частина мого експерименту з комп'ютером (заступною чернеткою) + моїм власним редагуванням.
Той самий голос, той самий прагматизм, тільки швидші пальці.Про моє обладнання: Я використовую NVIDIA RTX A4000 (16GB VRAM), AMD Ruben 9950X і 96GB DDR5 RAM.Але тобі це не потрібно!Як описано у розділі Частина 1, ви можете використовувати будь- яку програму NVIDIA GPU з 8GB+ VRAM або навіть виконувати тільки ЦП (повільне, але функціональне).
Ця частина може здаватися базовою, якщо ви вже знайомі з
graph LR
A[AI Workload] --> B{Type?}
B -->|Matrix Operations| C[GPU: 100x+ faster]
B -->|Sequential Logic| D[CPU: Better]
C --> E[Embedding Generation]
C --> F[LLM Inference]
C --> G[Vector Search]
D --> H[Application Logic]
D --> I[File I/O]
class C gpu
class E,F,G aiTasks
classDef gpu stroke:#333,stroke-width:4px
classDef aiTasks stroke:#333
, але повірте мені - я змарнував незліченну кількість годин усування загадкових помилок, що ведуть до невідповідність версії, відсутніх змінних середовища або помилкових:
- У GPU тисячі ядер/ процесорів процесораДії матриці
- AI - в основному математика матриці, в якій GPU перевершуєПропускна здатність пам' яті
- GPU переміщує дані набагато швидшеСпеціальне обладнання
Ядери струменя прискорюють виконання дій, пов' язаних з ШІ
Приклад реального світу(на моєму комп' ютері): створення вбудувань для допису блогу:
(24GB): найшвидший, ~0. 2s на допис
(12GB): ~0. 5s на допис
Ядери CUDA 6144
RTX 4090 * 24GB} 13B-30B'sOverking for this project}** RTX 4070 Ti} 12GB} 7B-13B} = choice}**
** RTX 3060} 12GB} 7B} Бюджет-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------**РТХ 4060Ті 16ГБ} 7Б-13Б}Часте значення
** А4000 (мена)} 16GB} 7Б-13Б} Робоча точка GPU}**:
: NPUs не підтримує CUDA, яку використовує цей навчальний посібник:
: Продовжує розвиватися LLMЯкщо на вашому комп' ютері встановлено процесор NPUУ поточній версії використовувати режим лише ЦП (все працює, лише повільніше)
ONNX Runtime DirectML
# PowerShell
wmic path win32_VideoController get name
оновлення
Name
NVIDIA RTX A4000
Майбутні частини будуть зауважувати, коли покращується підтримка NPU
НВІДІЯ
graph TB
A[Your C# Application] --> B[ONNX Runtime / LLamaSharp]
B --> C[CUDA Toolkit]
C --> D[cuDNN Libraries]
D --> E[NVIDIA Driver]
E --> F[GPU Hardware]
G[TensorRT] -.Optional.-> D
class A,F endpoints
class C,D,E install
classDef endpoints stroke:#333,stroke-width:4px
classDef install stroke:#333,stroke-width:2px
subgraph "What We'll Install"
C
D
E
end
тому що вона доросла і добре підтримується в NET, але концепції будуть перекладатися на NPU, як тільки екосистема наздожене!:
кДНunit description in lists
graph LR
A[1. NVIDIA Driver] --> B[2. CUDA Toolkit]
B --> C[3. cuDNN]
C --> D[4. Verify Install]
D --> E[5. Test from C#]
class A,B,C,D,E steps
classDef steps stroke:#333,stroke-width:2px
nvidia-smi
Ваша програма
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 546.33 Driver Version: 546.33 CUDA Version: 12.3 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA RTX A4000 WDDM | 00000000:01:00.0 Off | Off |
| 41% 32C P8 10W / 140W | 345MiB / 16376MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
- Наш код C#:
Driver VersionВстановлення траєкторіїCUDA VersionОсь наказ, який ми встановимо (впорядкування має значення!):Memory-UsageКрок 1: Драйвер NVIDIAOpen PowerShell:nvidia-smiВи повинні бачити вивід такий:
Інформація про ключ: має бути 545. xx або новіший
: Це версія MAX CUDA, а не встановленої
RTX A4000
Операційна система:nvidia-smi
(або ваша версія)
Драйвер Studio(Ще стабільніше, ніж готова гра)Встановлення і перезавантаженняПеревірити ще раз за допомогою
Архів інструментів CUDA
Installation Type: Custom (Advanced)
Select Components:
✅ CUDA Toolkit
✅ CUDA Documentation
✅ CUDA Samples
✅ CUDA Visual Studio Integration
❌ GeForce Experience (not needed)
❌ NVIDIA Driver (already installed)
ВибратиУтиліта CUDA 12.1
Виберіть:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1
Windows → x86_ 64 → 11 → exe (local)
Параметри встановлення
Запустити інструмент встановлення.:
$env:CUDA_PATH
# Should show: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1
$env:PATH -split ';' | Select-String CUDA
# Should show CUDA bin and libnvvp paths
Коли запитано::
Чому існує звичай?Ми не хочемо знижувати рівень нашого водія чи встановлювати ігрове програмне забезпечення.:
This PCТиповий шлях:Але зауважте - нам знадобиться це для змінних середовища!Встановити змінні середовищаЗазвичай, інструмент встановлення встановлює ці параметри, але перевірити:
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1CUDA_PATH_V12_1 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1Перевірити у PowerShellPathЯкщо немає, додавати вручну
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp
ВідкритиЗмінні середовища
# Check CUDA compiler
nvcc --version
# Should output:
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2023 NVIDIA Corporation
# Built on Tue_Feb__7_19:32:13_Pacific_Standard_Time_2023
# Cuda compilation tools, release 12.1, V12.1.66
# Check path resolves
where.exe nvcc
# Should show: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\nvcc.exe
Під
, перевірка/додаток:: Вхідзмінна, гарантуйте існування таких змінних:
Перезапустити терміналнаслідувати зміниПеревірити встановлення CUDA**Крок 3: KuDN (CUDA глибока невербальна бібліотека мережі)**cDN є оптимізованою реалізацією глибоких навчальних операцій.
Перейти до
Архів cuDNВам потрібен обліковий запис розробника NVIDIA (безкоштовний)
cudnn-windows-x86_64-8.9.7.29_cuda12-archive\
bin\
cudnn64_8.dll
cudnn_adv_infer64_8.dll
cudnn_adv_train64_8.dll
... (more DLLs)
include\
cudnn.h
... (header files)
lib\
x64\
cudnn.lib
... (lib files)
Знайти::
# Assuming you extracted to Downloads and CUDA is in default location
# Run PowerShell as Administrator
$cudnnPath = "$env:USERPROFILE\Downloads\cudnn-windows-x86_64-8.9.7.29_cuda12-archive"
$cudaPath = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1"
# Copy DLLs
Copy-Item "$cudnnPath\bin\*.dll" -Destination "$cudaPath\bin\"
# Copy headers
Copy-Item "$cudnnPath\include\*.h" -Destination "$cudaPath\include\"
# Copy libs
Copy-Item "$cudnnPath\lib\x64\*.lib" -Destination "$cudaPath\lib\x64\"
Звантажити cuDN v8. 9. 7 (5 грудня 2023) для CUDA 12. x:
bin\Локальний встановлювач для Windows (Zip)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\include\Видобути і встановити cuDNC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\include\lib\x64\Видобути ZIPC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\lib\x64\# Check DLLs exist
Test-Path "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\cudnn64_8.dll"
# Should return: True
# List all cuDNN DLLs
Get-ChildItem "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\cudnn*.dll"
Або зробіть це вручну
nvidia-smi
до
nvcc --version
до
# All these should return paths
$env:CUDA_PATH
$env:CUDA_PATH_V12_1
# Check PATH includes CUDA bin
$env:PATH -split ';' | Select-String CUDA
Перевірити встановлення cuDN
Крок 4: повна перевірка:
cd "C:\ProgramData\NVIDIA Corporation\CUDA Samples\v12.1"
Переконаймося, що все працює разом.:
cd "1_Utilities\deviceQuery"
Перевірка обладнанняПотрібно показати вашу програму GPU без помилок.
# If you have VS 2022
"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" deviceQuery_vs2022.vcxproj /p:Configuration=Release /p:Platform=x64
Перевірка CUDA:
.\x64\Release\deviceQuery.exe
Визначає, чи слід показувати CUDA 12. 1 (або будь- яку версію, яку ви встановили).
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA RTX A4000"
CUDA Driver Version / Runtime Version 12.3 / 12.1
CUDA Capability Major/Minor version number: 8.6
Total amount of global memory: 16376 MBytes (17174683648 bytes)
(048) Multiprocessors, (128) CUDA Cores/MP: 6144 CUDA Cores
GPU Max Clock rate: 1560 MHz (1.56 GHz)
Memory Clock rate: 7001 Mhz
Memory Bus Width: 256-bit
L2 Cache Size: 4194304 bytes
...
Result = PASS
Перевірка системних змінних: Result = PASS
Перевірка SUDA (Необов' язкові, але рекомендовані)
Давайте компілювати і запускати один.
mkdir CudaTest
cd CudaTest
dotnet new console -n CudaTest
cd CudaTest
Скомпілювати(обов'язково Visual Studio)
dotnet add package Microsoft.ML.OnnxRuntime.Gpu # Latest version
Запустити
Microsoft.ML.OnnxRuntimeВи повинні бачити вивід такий:Microsoft.ML.OnnxRuntime.GpuРядок ключаКрок 5: Перевірка з C#Program.cs:
using Microsoft.ML.OnnxRuntime;
using System;
using System.Linq;
namespace CudaTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== CUDA Test from C# ===\n");
// Test 1: Can we create a CUDA execution provider?
Console.WriteLine("Test 1: CUDA Execution Provider");
try
{
var cudaProviderOptions = new OrtCUDAProviderOptions();
var sessionOptions = new SessionOptions();
sessionOptions.AppendExecutionProvider_CUDA(cudaProviderOptions);
Console.WriteLine("✅ CUDA execution provider created successfully");
Console.WriteLine($" Device ID: {cudaProviderOptions.DeviceId}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ Failed to create CUDA provider: {ex.Message}");
return;
}
// Test 2: Check available providers
Console.WriteLine("\nTest 2: Available Execution Providers");
var providers = OrtEnv.Instance().GetAvailableProviders();
foreach (var provider in providers)
{
Console.WriteLine($" - {provider}");
}
if (providers.Contains("CUDAExecutionProvider"))
{
Console.WriteLine("✅ CUDA provider is available");
}
else
{
Console.WriteLine("❌ CUDA provider NOT available");
}
// Test 3: Get CUDA device count and info
Console.WriteLine("\nTest 3: CUDA Device Information");
try
{
// ONNX Runtime doesn't expose deviceQuery directly,
// but we can test by trying to create a session
var opts = new SessionOptions();
opts.AppendExecutionProvider_CUDA(0); // Device 0
Console.WriteLine("✅ Successfully configured for CUDA device 0");
Console.WriteLine(" (Full device info requires native CUDA calls)");
}
catch (Exception ex)
{
Console.WriteLine($"❌ CUDA device configuration failed: {ex.Message}");
}
Console.WriteLine("\n=== Test Complete ===");
}
}
}
А тепер найцікавіша частина - давайте використаємо CUDA з C#!:
Створити тестовий проектДодати ONNX Runtime з CUDA
DeviceIdONNX RuntimeЧому цей пакет?- Тільки ЦП
СтворитиРозпад коду
dotnet run
Можна встановити обмеження на пам' ять, рівень оптимізації тощо.:
=== CUDA Test from C# ===
Test 1: CUDA Execution Provider
✅ CUDA execution provider created successfully
Device ID: 0
Test 2: Available Execution Providers
- CUDAExecutionProvider
- CPUExecutionProvider
✅ CUDA provider is available
Test 3: CUDA Device Information
✅ Successfully configured for CUDA device 0
(Full device info requires native CUDA calls)
=== Test Complete ===
Якщо це вдасться, SUDA працюєЯкщо він зазнає невдачі, щось у стеці буде розбито.
OrtEnv. Instance}.GetAvaiableProviders}):
# Make sure CUDA bin is in PATH
$env:PATH += ";C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin"
# Verify cudnn DLL exists
Test-Path "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\cudnn64_8.dll"
# Try running again
dotnet run
Має включати "CUDAExecutionProvider ," якщо все було встановлено правильноТакож показує "CPUExecutionProvider " як зворотний зв' язок
Запустити перевірку:
dotnet remove package Microsoft.ML.OnnxRuntime
dotnet add package Microsoft.ML.OnnxRuntime.Gpu --version 1.16.3
Вирішення загальних помилокПомилка: " DllNotFoundExcoding: неможливо завантажити DLL 'onxruntime'
Причина: ONX Runtime не може знайти CUDE DLS.
Помилка: "CUDAExecutionProvider не знайдено"
: Використання неправильного пакунка Runtime ONNX (лише CPU).
# Download sample model
Invoke-WebRequest -Uri "https://github.com/onnx/models/raw/main/vision/classification/mnist/model/mnist-8.onnx" -OutFile "mnist.onnx"
Помилка: " Код помилки CUDA: 35 (версія драйвера CUDA недостатньо) "Program.cs:
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using System;
using System.Diagnostics;
using System.Linq;
namespace CudaTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== GPU vs CPU Inference Test ===\n");
// Create dummy input (28x28 image flattened to 784 floats)
var inputData = Enumerable.Range(0, 784).Select(i => (float)i / 784).ToArray();
var tensor = new DenseTensor<float>(inputData, new[] { 1, 1, 28, 28 });
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor("Input3", tensor)
};
// Test 1: CPU Inference
Console.WriteLine("Test 1: CPU Inference");
var cpuTime = TestInference(inputs, useCuda: false, iterations: 100);
Console.WriteLine($" Average time: {cpuTime:F2}ms\n");
// Test 2: GPU Inference
Console.WriteLine("Test 2: GPU Inference");
var gpuTime = TestInference(inputs, useCuda: true, iterations: 100);
Console.WriteLine($" Average time: {gpuTime:F2}ms\n");
// Compare
Console.WriteLine("Comparison:");
Console.WriteLine($" CPU: {cpuTime:F2}ms");
Console.WriteLine($" GPU: {gpuTime:F2}ms");
Console.WriteLine($" Speedup: {cpuTime / gpuTime:F2}x faster on GPU");
}
static double TestInference(List<NamedOnnxValue> inputs, bool useCuda, int iterations)
{
var options = new SessionOptions();
if (useCuda)
{
options.AppendExecutionProvider_CUDA(0);
}
using var session = new InferenceSession("mnist.onnx", options);
// Warmup run (first run is always slower)
session.Run(inputs);
// Timed runs
var sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
using var results = session.Run(inputs);
// Force evaluation
var output = results.First().AsEnumerable<float>().ToArray();
}
sw.Stop();
return sw.Elapsed.TotalMilliseconds / iterations;
}
}
}
Причина:
**: Водій застарий для СУДА 12.x.**Виправити
[1, 1, 28, 28]Додаткова перевірка: Поточна несуттєвість**Давайте зробимо щось реальне - запустимо крихітну нейронну мережу на процесорі процесора і порівняймо швидкість.**Звантажити випробувальну модель
Тестовий код індексуОновити
DenseTensor- ONX Runtime - це багатовимірні масиви
dotnet run
= пакетний_ розмір=1, канали=1, висота=28, Ширина=28Названо OnnxValue
=== GPU vs CPU Inference Test ===
Test 1: CPU Inference
Average time: 0.42ms
Test 2: GPU Inference
Average time: 0.15ms
Comparison:
CPU: 0.42ms
GPU: 0.15ms
Speedup: 2.80x faster on GPU
- Прив' язка десятини до назви вхідних даних
Часова методологія ✅ Driver installed correctly ✅ CUDA Toolkit accessible ✅ cuDNN integrated ✅ ONNX Runtime finds CUDA ✅ C# can run GPU-accelerated inference
Очікувався вивід
sequenceDiagram
participant App as C# Application
participant CPU as CPU Memory
participant GPU as GPU Memory
participant Compute as GPU Cores
App->>CPU: Create input tensor
CPU->>GPU: Transfer input (PCIe)
Note over GPU: Slow! ~16GB/s
GPU->>Compute: Execute model
Note over Compute: Fast! TFLOPS
Compute->>GPU: Write output
GPU->>CPU: Transfer output (PCIe)
Note over GPU: Slow again!
CPU->>App: Return results
(Ваші числа будуть змінюватися)::
graph TD
A[Inference Request] --> B{Model Size}
B -->|< 100MB| C{Batch Size}
B -->|> 100MB| D[Use GPU]
C -->|Single Item| E[Use CPU]
C -->|Batch > 10| D
D --> F[10-100x Faster]
E --> G[Lower Latency for Single]
class D,E choice
classDef choice stroke:#333,stroke-width:2px
Пляшка для перенесення пам' яті:
Зберігати дані на GPU
Процесор
nvidia-smi- Маленькі моделі, одинарні запити, критичні за запізненняnvccДля нашого помічника запису блогу:
Пакетний процес 100+ шматки → ГПУПідсумок LLM- Велика модель (7Б парам) → ГПУ
Векторний пошук
Зведення
Ми успішно:
і
Наше середовище розробки тепер готове до роботи комп' ютера з комп' ютером I!
# Check GPU
nvidia-smi
# Check CUDA
nvcc --version
where.exe nvcc
# Check cuDNN
Test-Path "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\cudnn64_8.dll"
# Check environment
$env:CUDA_PATH
$env:PATH -split ';' | Select-String CUDA
# Test from C#
dotnet run
, ми зануримося глибоко в вбудовування і векторні бази даних:
|-------|-------|-----|
| nvidia-smiЩо таке вбудовування і як вони уможливлюють семантичний пошук?
| nvccВибір між Qdrant, pgvector та іншими параметрами
Створення локальних вбудовування за допомогою ONNX Runtime
Ефективно зберігати і розпитувати мільйони векторівMicrosoft.ML.OnnxRuntime.Gpu |
Побудова нашого першого прототипу семантичного пошуку
Посилання на розв' язання проблем |--------------|---------------|--------------|-----------------| Швидкі команди діагностики Загальні питання ♪
Частина 4.Частина 5: Клієнт WindowsЧастина 6: Інтеграція локального LLM
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.