मुख्य कंटेंट तक स्किप करें

मूल्यांकन और बेंचमार्क टेस्टिंग

यह लेख गो AI की खेल शक्ति और प्रदर्शन का मूल्यांकन करने का परिचय देता है, जिसमें Elo रेटिंग सिस्टम, मैच टेस्टिंग विधियाँ और मानक बेंचमार्क टेस्ट शामिल हैं।


Elo रेटिंग सिस्टम

मूल अवधारणा

Elo रेटिंग सापेक्ष खेल शक्ति मापने की मानक विधि है:

अपेक्षित जीत दर E_A = 1 / (1 + 10^((R_B - R_A) / 400))

नया Elo = पुराना Elo + K × (वास्तविक परिणाम - अपेक्षित परिणाम)

Elo अंतर और जीत दर तुलना

Elo अंतरमजबूत खिलाड़ी की जीत दर
050%
10064%
20076%
40091%
80099%

कार्यान्वयन

def expected_score(rating_a, rating_b):
"""A का B के खिलाफ अपेक्षित स्कोर गणना करें"""
return 1 / (1 + 10 ** ((rating_b - rating_a) / 400))

def update_elo(rating, expected, actual, k=32):
"""Elo रेटिंग अपडेट करें"""
return rating + k * (actual - expected)

def calculate_elo_diff(wins, losses, draws):
"""मैच परिणामों से Elo अंतर गणना करें"""
total = wins + losses + draws
win_rate = (wins + 0.5 * draws) / total

if win_rate <= 0 or win_rate >= 1:
return float('inf') if win_rate >= 1 else float('-inf')

return 400 * math.log10(win_rate / (1 - win_rate))

मैच टेस्टिंग

टेस्टिंग फ्रेमवर्क

class MatchTester:
def __init__(self, engine_a, engine_b):
self.engine_a = engine_a
self.engine_b = engine_b
self.results = {'a_wins': 0, 'b_wins': 0, 'draws': 0}

def run_match(self, num_games=400):
"""मैच टेस्ट निष्पादित करें"""
for i in range(num_games):
# बारी-बारी से काला/सफेद
if i % 2 == 0:
black, white = self.engine_a, self.engine_b
a_is_black = True
else:
black, white = self.engine_b, self.engine_a
a_is_black = False

# गेम खेलें
result = self.play_game(black, white)

# परिणाम रिकॉर्ड करें
if result == 'black':
if a_is_black:
self.results['a_wins'] += 1
else:
self.results['b_wins'] += 1
elif result == 'white':
if a_is_black:
self.results['b_wins'] += 1
else:
self.results['a_wins'] += 1
else:
self.results['draws'] += 1

return self.results

def play_game(self, black_engine, white_engine):
"""एक गेम खेलें"""
game = Game()

while not game.is_terminal():
if game.current_player == 'black':
move = black_engine.get_move(game.state)
else:
move = white_engine.get_move(game.state)

game.play(move)

return game.get_winner()

सांख्यिकीय महत्व

सुनिश्चित करें परीक्षण परिणाम सांख्यिकीय रूप से अर्थपूर्ण हैं:

from scipy import stats

def calculate_confidence_interval(wins, total, confidence=0.95):
"""जीत दर का कॉन्फिडेंस इंटरवल गणना करें"""
p = wins / total
z = stats.norm.ppf((1 + confidence) / 2)
margin = z * math.sqrt(p * (1 - p) / total)

return (p - margin, p + margin)

# उदाहरण
wins, total = 220, 400
ci_low, ci_high = calculate_confidence_interval(wins, total)
print(f"जीत दर: {wins/total:.1%}, 95% CI: [{ci_low:.1%}, {ci_high:.1%}]")

सुझाई गेम संख्या

अपेक्षित Elo अंतरसुझाई गेम संख्याकॉन्फिडेंस
>10010095%
50-10020095%
20-5040095%
<201000+95%

SPRT (सीक्वेंशियल प्रोबेबिलिटी रेशियो टेस्ट)

अवधारणा

निश्चित गेम संख्या की आवश्यकता नहीं, संचित परिणामों के आधार पर गतिशील रूप से रुकने का निर्णय:

def sprt(wins, losses, elo0=0, elo1=10, alpha=0.05, beta=0.05):
"""
सीक्वेंशियल प्रोबेबिलिटी रेशियो टेस्ट

elo0: नल परिकल्पना का Elo अंतर (आमतौर पर 0)
elo1: वैकल्पिक परिकल्पना का Elo अंतर (आमतौर पर 5-20)
alpha: फॉल्स पॉज़िटिव दर
beta: फॉल्स नेगेटिव दर
"""
if wins + losses == 0:
return 'continue'

# लॉग लाइकलीहुड रेशियो गणना करें
p0 = expected_score(elo1, 0) # H1 के तहत अपेक्षित जीत दर
p1 = expected_score(elo0, 0) # H0 के तहत अपेक्षित जीत दर

llr = (
wins * math.log(p0 / p1) +
losses * math.log((1 - p0) / (1 - p1))
)

# निर्णय सीमाएं
lower = math.log(beta / (1 - alpha))
upper = math.log((1 - beta) / alpha)

if llr <= lower:
return 'reject' # H0 अस्वीकृत, नया मॉडल कमजोर
elif llr >= upper:
return 'accept' # H0 स्वीकृत, नया मॉडल बेहतर
else:
return 'continue' # परीक्षण जारी रखें

KataGo बेंचमार्क टेस्टिंग

बेंचमार्क चलाएं

# मूल परीक्षण
katago benchmark -model model.bin.gz

# विज़िट संख्या निर्दिष्ट करें
katago benchmark -model model.bin.gz -v 1000

# विस्तृत आउटपुट
katago benchmark -model model.bin.gz -v 1000 -t 8

आउटपुट व्याख्या

KataGo Benchmark Results
========================

Configuration:
Model: kata-b18c384.bin.gz
Backend: CUDA
Threads: 8
Visits: 1000

Performance:
NN evals/second: 2847.3
Playouts/second: 4521.8
Avg time per move: 0.221 seconds

Memory:
GPU memory usage: 2.1 GB
System memory: 1.3 GB

Quality metrics:
Policy accuracy: 0.612
Value accuracy: 0.891

मुख्य मेट्रिक्स

मेट्रिकविवरणअच्छा मान
NN evals/secन्यूरल नेटवर्क मूल्यांकन गति>1000
Playouts/secMCTS सिमुलेशन गति>2000
GPU उपयोगGPU उपयोग दक्षता>80%

खेल शक्ति मूल्यांकन

मानव खेल शक्ति तुलना

AI Eloमानव खेल शक्ति
~1500एमेच्योर 1 दान
~2000एमेच्योर 5 दान
~2500प्रोफेशनल 1 दान
~3000प्रोफेशनल 5 दान
~3500विश्व चैंपियन स्तर
~4000+मानव से परे

प्रमुख AI की Elo

AIElo (अनुमानित)
KataGo (नवीनतम)~5000
AlphaGo Zero~5000
Leela Zero~4500
绝艺~4800

परीक्षण तुलना

def estimate_human_rank(ai_model, test_positions):
"""AI की मानव खेल शक्ति का अनुमान"""
# मानक परीक्षण प्रश्न उपयोग करें
correct = 0
for pos in test_positions:
ai_move = ai_model.get_best_move(pos['state'])
if ai_move == pos['best_move']:
correct += 1

accuracy = correct / len(test_positions)

# सटीकता तुलना तालिका
if accuracy > 0.9:
return "प्रोफेशनल स्तर"
elif accuracy > 0.7:
return "एमेच्योर 5 दान+"
elif accuracy > 0.5:
return "एमेच्योर 1-5 दान"
else:
return "एमेच्योर स्तर से नीचे"

प्रदर्शन मॉनिटरिंग

निरंतर मॉनिटरिंग

import time
import psutil
import GPUtil

class PerformanceMonitor:
def __init__(self):
self.metrics = []

def sample(self):
"""वर्तमान प्रदर्शन मेट्रिक्स सैंपल करें"""
gpus = GPUtil.getGPUs()

self.metrics.append({
'timestamp': time.time(),
'cpu_percent': psutil.cpu_percent(),
'memory_percent': psutil.virtual_memory().percent,
'gpu_util': gpus[0].load * 100 if gpus else 0,
'gpu_memory': gpus[0].memoryUsed if gpus else 0,
})

def report(self):
"""रिपोर्ट जनरेट करें"""
if not self.metrics:
return

avg_cpu = sum(m['cpu_percent'] for m in self.metrics) / len(self.metrics)
avg_gpu = sum(m['gpu_util'] for m in self.metrics) / len(self.metrics)

print(f"औसत CPU उपयोग: {avg_cpu:.1f}%")
print(f"औसत GPU उपयोग: {avg_gpu:.1f}%")

प्रदर्शन बॉटलनेक निदान

लक्षणसंभावित कारणसमाधान
CPU 100%, GPU कमसर्च थ्रेड्स अपर्याप्तnumSearchThreads बढ़ाएं
GPU 100%, आउटपुट धीमाबैच बहुत छोटाnnMaxBatchSize बढ़ाएं
मेमोरी अपर्याप्तमॉडल बहुत बड़ाछोटा मॉडल उपयोग करें
गति अस्थिरतापमान अधिककूलिंग सुधारें

ऑटोमेटेड टेस्टिंग

CI/CD इंटीग्रेशन

# .github/workflows/benchmark.yml
name: Benchmark

on:
push:
branches: [main]

jobs:
benchmark:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Run benchmark
run: |
./katago benchmark -model model.bin.gz -v 500 > results.txt

- name: Check performance
run: |
playouts=$(grep "Playouts/second" results.txt | awk '{print $2}')
if (( $(echo "$playouts < 1000" | bc -l) )); then
echo "Performance regression detected!"
exit 1
fi

रिग्रेशन टेस्टिंग

def regression_test(new_model, baseline_model, threshold=0.95):
"""जांचें नए मॉडल में प्रदर्शन रिग्रेशन है या नहीं"""
# सटीकता परीक्षण
new_accuracy = test_accuracy(new_model)
baseline_accuracy = test_accuracy(baseline_model)

if new_accuracy < baseline_accuracy * threshold:
raise Exception(f"सटीकता रिग्रेशन: {new_accuracy:.3f} < {baseline_accuracy:.3f}")

# गति परीक्षण
new_speed = benchmark_speed(new_model)
baseline_speed = benchmark_speed(baseline_model)

if new_speed < baseline_speed * threshold:
raise Exception(f"गति रिग्रेशन: {new_speed:.1f} < {baseline_speed:.1f}")

print("रिग्रेशन टेस्ट पास")

आगे पढ़ें