VAROITUS: NÄYTTELEVÄT NÄYTTEET, JOITA EI OLE KÄYTETTY.
Se on todennäköisesti suuri osa siitä, mikä alla on, ei toimi. Minä luon nämä minulle ja sitten teen kaikki askeleet ja saat näytesovelluksen toimimaan...Olet ollut ovela ja nähnyt ne! ne ovat todennäköisesti valmiita joulukuun puolivälissä.
## Johdanto
Tervetuloa toiseen osaanOsa 1
Laadimme vision kirjoittavan avustajan rakentamisesta, joka käyttää blogiasi tietopohjana - kuten se, miten asianajajat käyttävät oikeuskäytännössä koulutettuja LLM-asiantuntijoita asiakirjojen laatimiseen.
**Nyt on aika liata kädet perustuksella: varmista, että GPU on valmis tekoälyyn.**HUOMAUTUS: Tämä on osa kokeilujani tekoälyllä (avustettu suunnittelu) + omalla muokkauksellani.
Sama ääni, sama pragmatismi, vain nopeammat sormet.Rautakaupastani: Käytän NVIDIA RTX A4000 (16GB VRAM), AMD Ryzen 9 9950X ja 96GB DDR5 RAM -muistia.Mutta et tarvitse tätä!Kuten osassa 1 mainitaan, voit käyttää mitä tahansa NVIDIA GPU:ta, jossa on 8GB+ VRAM, tai käyttää jopa vain prosessoria (hitaampi mutta toimiva).
Tämä osa voi vaikuttaa perusasialta, jos olet jo perehtynyt
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
, mutta luota minuun - Olen tuhlannut lukemattomia tunteja salamyhkäisten virheiden vianetsintään, joka juontaa juurensa versioiden eroavuuksiin, puuttuviin ympäristömuuttujiin tai virheellisiin:
- GPU:ssa on tuhansia hylsyjä ja prosessorien kymmeniäMatrix-toiminnot
- tekoäly on enimmäkseen matriisimatematiikkaa, jossa GPU:t ovat loistaviaMemory Bandth
- GPU:t siirtävät dataa paljon nopeamminErikoistuneet laitteistot
Tensoriytimet nopeuttavat tekoälykohtaisia toimintoja
Oikean maailman esimerkki(laitteistoni päällä): Luomme upotuksia blogikirjoitukseen:
(24GB): Nopein, ~0,2s per virka
(12GB): ~0,5s per virka
6144 CUDA-ydintä
RTX 4090 24GB 13B-30B Overkill tähän hankkeeseenRTX 4070 Ti 12GB 7B-13B Erinomainen valinta
RTTX 3060, 12GB, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 6B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7B, 7BRTX 4060 Ti 16GB 7B-13B Suuri arvo
A4000 (miina) 16GB 7B-13B GPU-työasema:
: NPU:t eivät tue CUDAa, jota tämä opetusohjelma käyttää:
: Yhä kypsymässä LLM:illeJos sinulla on NPU-avustinKäytä nyt vain CPU-tilaa (kaikki toimii, vain hitaammin)
ONNX-runtime DirectML
# PowerShell
wmic path win32_VideoController get name
päivitykset
Name
NVIDIA RTX A4000
Tulevaisuuden osat huomaavat, kun NPU:n tuki paranee
NVIDIA CUDA
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
Koska se on kypsä ja hyvin tuettu .NETissä, mutta konseptit käännetään NPU:ille, kun ekosysteemi saavuttaa!:
cuDNN
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
Sovelluksesi
+-----------------------------------------------------------------------------+
| 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 |
+-------------------------------+----------------------+----------------------+
- Meidän C#-koodimme:
Driver VersionAsentamista koskeva etenemissuunnitelmaCUDA VersionAsennamme tämän tilauksen (tilausasiat!):Memory-UsageVaihe 1: NVIDIA DriverAvoin PowerShell:nvidia-smiNäkisitpä ulostulon kuten:
Avaintiedot: Pitäisi olla 545.xx tai uudempi
: Tämä on MAX CUDA -versio tuettuna, ei asennettuna
RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBenchmark (0821) RTBench (0821) RTBench (0821) RTBench (0821)
Käyttöjärjestelmä:nvidia-smi
(tai sinun versiosi)
Studio Driver(vakaampi kuin Game Ready)Asenna ja käynnistä uudelleenVarmista uudelleen
CUDA Toolkit Archive
Installation Type: Custom (Advanced)
Select Components:
✅ CUDA Toolkit
✅ CUDA Documentation
✅ CUDA Samples
✅ CUDA Visual Studio Integration
❌ GeForce Experience (not needed)
❌ NVIDIA Driver (already installed)
ValitseCUDA Toolkit 12.1
Valitse:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1
Windows → x86_64 → 11 → exe (paikallinen)
Asennusasetukset
Suorita asentaja.:
$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
Kun kehotus on annettu::
Miksi custom?: Emme halua heikentää ajuriamme tai asentaa peliohjelmia.:
This PCOletuspolku on hyvä:Mutta huomaa tämä - tarvitsemme sitä ympäristömuuttujia varten!Aseta ympäristömuuttujatAsentaja yleensä asettaa nämä, mutta varmistaa:
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1CUDA_PATH_V12_1 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1Tarkista PowerShellPathJos puuttuu, lisää manuaalisesti
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp
AvaaYmpäristömuuttujat
# 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
Alle
, tarkista/lisää:: Sisäänmuuttuja, varmista, että nämä ovat olemassa:
Käynnistä pääte uudelleenJotta muutokset tulisivat voimaanVarmista CUDA-asennus**Vaihe 3: cuDNN (CUDA Deep Neural Network -kirjasto)**cuDNN tarjoaa optimoituja toteutuksia syväoppimiseen.
Siirry
cuDNN-arkistoTarvitset NVIDIA-kehittäjän tilin (ilmainen)
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)
Etsi::
# 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\"
Lataa cuDNN v8.9.7 (5. joulukuuta 2023), CUDA 12.x:
bin\Paikallinen asennin Windowsille (Zip)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\include\Ote ja asenna cuDNNC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\include\lib\x64\Poista 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"
Tai tee se käsin
nvidia-smi
Kohtiin
nvcc --version
Kohtiin
# All these should return paths
$env:CUDA_PATH
$env:CUDA_PATH_V12_1
# Check PATH includes CUDA bin
$env:PATH -split ';' | Select-String CUDA
Varmista cuDNN-asennus
Vaihe 4: Täydellinen varmennus:
cd "C:\ProgramData\NVIDIA Corporation\CUDA Samples\v12.1"
Varmistetaan, että kaikki toimii yhdessä.:
cd "1_Utilities\deviceQuery"
Laitteiston tarkistusPitäisi näyttää GPU ilman virheitä.
# 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-tarkistus:
.\x64\Release\deviceQuery.exe
Näytä CUDA 12.1 (tai mitä tahansa versiota olet asentanut).
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
Järjestelmämuuttujat tarkastetaan: Result = PASS
CUDA-näytteiden testi (valinnainen, mutta suositeltava)
Kokoonnutaan ja juostaan yksi.
mkdir CudaTest
cd CudaTest
dotnet new console -n CudaTest
cd CudaTest
Koosta se(vaatii Visual Studiota):
dotnet add package Microsoft.ML.OnnxRuntime.Gpu # Latest version
Suorita se
Microsoft.ML.OnnxRuntimeNäkisitpä ulostulon kuten:Microsoft.ML.OnnxRuntime.GpuAvainriviVaihe 5: C#:n testausProgram.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 ===");
}
}
}
Nyt hauska osa - käytetään itse asiassa C#:n CUDAa!:
Luo testiprojektiLisää ONNX-käyttöaika CUDA:n kanssa
DeviceIdONNX-ajoaikaMiksi tämä paketti?- Vain prosessori
LuoKoodin jaottelu
dotnet run
Voi asettaa muistin rajat, optimointitason jne.:
=== 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 ===
Jos tämä onnistuu, CUDA toimiiJos se epäonnistuu, jokin pinossa on rikki
OrtEnv.Instance().GetAvailableProviders():
# 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
**Jos kaikki on asennettu oikein, mukana on oltava "CUDA ExecutionProvider"**Näyttää myös "CPUExecutionProvider" vararenkaana
Suorita testi:
dotnet remove package Microsoft.ML.OnnxRuntime
dotnet add package Microsoft.ML.OnnxRuntime.Gpu --version 1.16.3
Tavallisten virheiden vianetsintäVirhe: "DllNotFoundException: Ei voitu ladata DLL "onnxruntime"
Syy: ONNX Runtime ei löydä CUDA DLLs.
Virhe: "CUDA ExecutionProvideria ei löytynyt"
: Käytetään väärää ONNX-runtime-pakettia (vain CPU).
# Download sample model
Invoke-WebRequest -Uri "https://github.com/onnx/models/raw/main/vision/classification/mnist/model/mnist-8.onnx" -OutFile "mnist.onnx"
Virhe: "CUDA-virhekoodi: 35 (CUDA-ajurin versio on riittämätön)"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;
}
}
}
Syy:
**Kuljettaja on liian vanha CUDA 12.x:lle.**Korjaa
[1, 1, 28, 28]Advanced Test: Todellinen päätelmä**Tehdään jotain todellista - tehdään pieni hermoverkko GPU:n ja CPU:n välillä ja vertaillaan nopeuksia.**Lataa testimalli
Päättymistestien koodiPäivitä
Densetensori- ONNX Runtime edustaa moniulotteisia sarjoja
dotnet run
= erä_koko=1, kanavat=1, korkeus=28, leveys=28NimettyOnnxValue
=== 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
- Liittää tensorin syötenimeen
Ajoitusmenetelmä ✅ Driver installed correctly ✅ CUDA Toolkit accessible ✅ cuDNN integrated ✅ ONNX Runtime finds CUDA ✅ C# can run GPU-accelerated inference
Odotettu tuotos
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
(numerosi vaihtelevat)::
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
Muistinsiirtojen pullonkaula:
Säilytä tiedot GPU:sta
Suoritin
nvidia-smi- Pienet mallit, yksittäiset pyynnöt, latenssikriittisyysnvccBlogin kirjoittamisen assistentti:
Eräprosessi 100+ kappaletta → GPULLM-päätelmä- Iso malli (7B paramit) → GPU
Vektorihaku
Yhteenveto
Onnistuimme:
sekä
Kehitysympäristömme on nyt valmis tekoälyyn!
# 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
Sukellamme syvälle upotus- ja vektoritietokantoihin:
|-------|-------|-----|
| nvidia-smiMitkä ovat upotukset ja miten ne mahdollistavat semanttisen etsinnän?
| nvccQdrantin, pgvectorin ja muiden vaihtoehtojen valinta
Luodaan upotuksia paikallisesti ONNX-runtimella
Miljoonia vektoreita varastoidaan ja tiedustellaan tehokkaastiMicrosoft.ML.OnnxRuntime.Gpu |
Ensimmäisen semanttisen hakuprototyypin rakentaminen
Vianmääritysreferenssi |--------------|---------------|--------------|-----------------| Nopeat diagnostiset komennot Yhteiset kysymykset Erehdys Syy Korjata
Osa 4: Ruoansulatusputken rakentaminenOsa 5: Windows-asiakasOsa 6: Paikallinen LLM-integraatio
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.