This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Wednesday, 12 November 2025
AVERTISSEMENT: CES PROJETS DE POSTES QUI 'ESCAPÉ'.
Il est probable qu'une grande partie de ce qui est ci-dessous ne fonctionnera pas; je les génère comme comment faire pour MOI, puis faire toutes les étapes et obtenir le travail de l'application d'échantillon ... Vous avez été sournois et les a vus! ils seront probablement prêts à la mi-décembre.
## Présentation
Bienvenue dans la deuxième partiePremière partie
, nous avons exposé la vision pour construire un assistant d'écriture qui utilise votre blog comme base de connaissances - comme la façon dont les avocats utilisent les LLM formés sur la jurisprudence pour rédiger des documents.
**Maintenant, il est temps de se salir les mains avec la fondation: s'assurer que votre GPU est prêt pour les charges de travail d'IA.**REMARQUE: Ceci fait partie de mes expériences avec l'IA (couture assistée) + mon propre montage.
Même voix, même pragmatisme, juste des doigts plus rapides.À propos de mon matériel: J'utilise un NVIDIA RTX A4000 (16GB VRAM), AMD Ryzen 9 9950X et 96GB DDR5 RAM.Mais tu n'as pas besoin de ça !Comme couvert dans la partie 1, vous pouvez utiliser n'importe quel GPU NVIDIA avec 8 Go + VRAM, ou même exécuter CPU-seulement (inférieur mais fonctionnel).
Cette partie pourrait sembler basique si vous êtes déjà familier avec
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
, mais croyez-moi - J'ai gaspillé d'innombrables heures à déboguer des erreurs mystérieuses qui remontaient à des erreurs de version, des variables d'environnement manquantes, ou incorrectes:
- Les GPU ont des milliers de cœurs contre des dizaines de CPUOpérations matricielles
- L'IA est principalement matricielle, qui GPUs excelle àBande passante de la mémoire
- Les GPU déplacent les données beaucoup plus viteMatériel spécialisé
Les cœurs de tension accélèrent les opérations spécifiques à l'IA
Exemple du monde réel(sur mon matériel): Génération d'intégrations pour un billet de blog:
(24 Go): Plus rapide, ~0.2s par poste
(12GB): ~0,5s par poste
6144 Noyaux CUDA
RTX 4090: 24GB: 13B-30B: Surkill pour ce projet:RTX 4070 Ti 12GB 7B-13B Excellent choix
RTX 3060:00 12GB:00 7B:00 Bon budget-friendlyRTX 4060 Tio: 16GB: 7B-13B: Grande valeur
*** A4000 (mine) * 16 Go * 7B-13B * Poste de travail * GPU ***:
: Les NPU ne prennent pas en charge CUDA, que ce tutoriel utilise:
: Toujours en phase de maturation pour les LLMSi vous avez un processeur équipé de NPUUtilisez le mode CPU seulement pour l'instant (tout fonctionne, juste plus lentement)
ONNX Runtime DirectML
# PowerShell
wmic path win32_VideoController get name
mises à jour
Name
NVIDIA RTX A4000
Les parties futures noteront quand le soutien NPU s'améliorera
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
parce qu'il est mature et bien soutenu dans .NET, mais les concepts se traduiront par les NPU une fois l'écosystème rattrapé !:
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
Votre demande
+-----------------------------------------------------------------------------+
| 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 |
+-------------------------------+----------------------+----------------------+
- Notre code C#:
Driver VersionFeuille de route pour l'installationCUDA VersionVoici l'ordre que nous allons installer des choses (l'ordre compte!):Memory-UsageÉtape 1: Pilote NVIDIAOuvrez PowerShell :nvidia-smiVous devriez voir la sortie comme :
Informations clés: devrait être 545.xx ou plus récent
: C'est la version MAX CUDA prise en charge, pas ce qui est installé
NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1 NT1
Système d'exploitation:nvidia-smi
(ou votre version)
Pilote Studio(plus stable que Game Ready)Installer et redémarrerVérifiez à nouveau avec
Archive de la boîte à outils 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)
SélectionnerBoîte à outils CUDA 12.1
Choisissez :
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1
Windows → x86_64 → 11 → exe (local)
Options d'installation
Exécutez l'installateur.:
$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
Lorsqu'il est demandé ::
Pourquoi Custom ?: Nous ne voulons pas dévaloriser notre pilote ou installer un logiciel de jeu.:
This PCLe chemin par défaut est bon :Mais notez ceci - nous en aurons besoin pour les variables d'environnement!Définir les variables d'environnementL'installateur les définit habituellement, mais vérifie:
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1CUDA_PATH_V12_1 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1Vérifiez PowerShellPathS'il manque, ajouter manuellement
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp
OuvrirVariables d'environnement
# 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
Sous
, vérifier/ajouter:: DansVariable, assurez-vous qu'il en existe:
Redémarrez votre terminalpour les modifications à prendre en vigueurVérifier l'installation de CUDA**Étape 3 : cudNN (bibliothèque du réseau neurologique profond de la CUDA)**cuDNN fournit des implémentations optimisées des opérations d'apprentissage profond.
Allez-y.
Archives cudNNVous aurez besoin d'un compte NVIDIA Developer (gratuit)
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)
Rechercher ::
# 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\"
Télécharger cuDNN v8.9.7 (5 décembre 2023), pour CUDA 12.x:
bin\Installateur local pour Windows (Zip)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin\include\Extraire et installer cudNNC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\include\lib\x64\Extraire le 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"
Ou faites-le manuellement
nvidia-smi
à l ' Assemblée générale
nvcc --version
à l ' Assemblée générale
# All these should return paths
$env:CUDA_PATH
$env:CUDA_PATH_V12_1
# Check PATH includes CUDA bin
$env:PATH -split ';' | Select-String CUDA
Vérifier l'installation de cudNN
Étape 4 : Vérification complète:
cd "C:\ProgramData\NVIDIA Corporation\CUDA Samples\v12.1"
Assurons-nous que tout fonctionne ensemble.:
cd "1_Utilities\deviceQuery"
Vérification du matérielDoit afficher votre GPU sans erreur.
# 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
Vérification CUDA:
.\x64\Release\deviceQuery.exe
Doit afficher CUDA 12.1 (ou quelle que soit la version que vous avez installée).
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
Vérification des variables système: Result = PASS
Essai des échantillons CUDA (facultatif mais recommandé)
Compilons et en faisons un.
mkdir CudaTest
cd CudaTest
dotnet new console -n CudaTest
cd CudaTest
Compilez-le.(nécessite un studio visuel) :
dotnet add package Microsoft.ML.OnnxRuntime.Gpu # Latest version
Exécutez-le.
Microsoft.ML.OnnxRuntimeVous devriez voir la sortie comme :Microsoft.ML.OnnxRuntime.GpuLa ligne cléÉtape 5 : Essais à partir de 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 ===");
}
}
}
Maintenant la partie amusante - utilisons en fait CUDA de C#!:
Créer un projet d'essaiAjouter ONNX Runtime avec CUDA
DeviceIdONNX Durée d'exécutionPourquoi ce paquet ?- CPU seulement
CréerVentilation par code
dotnet run
Peut définir les limites de mémoire, le niveau d'optimisation, etc.:
=== 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 ===
Si cela réussit, CUDA travailleSi elle échoue, quelque chose dans la pile est cassé
OrtEnv.Instance().ObtenezDisponibleProvideurs():
# 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
Doit inclure "CUDAExecutionProvider" si tout est installé correctementAffiche également "CPUExecutionProvider" comme retour en arrière
Exécuter l'essai:
dotnet remove package Microsoft.ML.OnnxRuntime
dotnet add package Microsoft.ML.OnnxRuntime.Gpu --version 1.16.3
Dépannage des erreurs courantesErreur: "DllNotFoundException: Impossible de charger DLL 'onnxruntime'"
Cause: ONNX Runtime ne trouve pas les DLLs CUDA.
Erreur : "CUDAExecutionProvider non trouvé"
: Utilisation d'un mauvais paquet ONNX Runtime (uniquement CPU).
# Download sample model
Invoke-WebRequest -Uri "https://github.com/onnx/models/raw/main/vision/classification/mnist/model/mnist-8.onnx" -OutFile "mnist.onnx"
Erreur : "Code d'erreur CUDA : 35 (la version du pilote CUDA est insuffisante)"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;
}
}
}
Cause:
**: Le conducteur est trop vieux pour CUDA 12.x.**Correction
[1, 1, 28, 28]Test avancé : Inférence réelle**Faisons quelque chose de réel - exécutez un petit réseau neuronal sur GPU vs CPU et comparez les vitesses.**Télécharger un modèle d'essai
Code d'essai d'inférenceMise à jour
DenseTeneur- La manière d'ONNX Runtime de représenter les tableaux multidimensionnels
dotnet run
= batch_size=1, canaux=1, hauteur=28, largeur=28Nommé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
- Raccorde un tenseur à un nom d'entrée
Méthode de calendrier ✅ Driver installed correctly ✅ CUDA Toolkit accessible ✅ cuDNN integrated ✅ ONNX Runtime finds CUDA ✅ C# can run GPU-accelerated inference
Produit escompté
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
(vos numéros varieront)::
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
Transfert de mémoire goulot d'étranglement:
Conserver les données sur GPU
CPU
nvidia-smi- Petits modèles, demandes uniques, latence-critiquenvccPour notre assistant d'écriture de blog:
Procédé par lots de plus de 100 morceaux → GPUInférence LLM- Grand modèle (7B params) → GPU
Recherche vectorielle
Résumé
Nous avons réussi :
et
Notre environnement de développement est maintenant prêt pour les charges de travail de l'IA!
# 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
, nous plongerons profondément dans les bases de données vectorielles et d'intégration :
|-------|-------|-----|
| nvidia-smiQuels sont les éléments d'intégration et comment permettent-ils la recherche sémantique ?
| nvccChoix entre Qdrant, pgvector et d'autres options
Génération d'intégrations locales avec ONNX Runtime
Entreposer et interroger efficacement des millions de vecteursMicrosoft.ML.OnnxRuntime.Gpu |
Construire notre premier prototype de recherche sémantique
Référence de dépannage |--------------|---------------|--------------|-----------------| Commandes diagnostiques rapides Questions communes Erreur Cause Correction
Partie 4: Construction du pipeline d'ingestionPartie 5: Le client WindowsPartie 6: Intégration locale des LLM
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.