| | |
| | """ |
| | 🧪 Test script for converted GGUF model |
| | Tests both llama.cpp and Ollama integration |
| | """ |
| |
|
| | import os |
| | import subprocess |
| | import time |
| | import requests |
| | import json |
| | from pathlib import Path |
| |
|
| |
|
| | def test_llamacpp_direct(): |
| | """Test model directly with llama.cpp""" |
| | print("🧪 Testing with llama.cpp directly...") |
| |
|
| | model_file = "my_custom_model.gguf" |
| | if not os.path.exists(model_file): |
| | print(f"❌ Model file not found: {model_file}") |
| | return False |
| |
|
| | llamacpp_main = "./llama.cpp/main" |
| | if not os.path.exists(llamacpp_main): |
| | print(f"❌ llama.cpp main not found: {llamacpp_main}") |
| | print("Run: ./convert_to_gguf.sh first") |
| | return False |
| |
|
| | test_prompts = [ |
| | "Hello, how are you?", |
| | "Wyjaśnij co to jest Docker", |
| | "Napisz prostą funkcję w Pythonie" |
| | ] |
| |
|
| | for i, prompt in enumerate(test_prompts, 1): |
| | print(f"\n--- Test {i}/3: {prompt[:30]}... ---") |
| |
|
| | cmd = [ |
| | llamacpp_main, |
| | "-m", model_file, |
| | "-p", prompt, |
| | "-n", "100", |
| | "--temp", "0.7", |
| | "--top-p", "0.9" |
| | ] |
| |
|
| | try: |
| | result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) |
| | if result.returncode == 0: |
| | print("✅ Response generated successfully") |
| | print("Response preview:", result.stdout[:200] + "..." if len(result.stdout) > 200 else result.stdout) |
| | else: |
| | print(f"❌ Error: {result.stderr}") |
| | return False |
| | except subprocess.TimeoutExpired: |
| | print("⏰ Timeout - model may be too slow") |
| | return False |
| | except Exception as e: |
| | print(f"❌ Exception: {e}") |
| | return False |
| |
|
| | return True |
| |
|
| |
|
| | def test_ollama_integration(): |
| | """Test model through Ollama""" |
| | print("\n🤖 Testing Ollama integration...") |
| |
|
| | |
| | try: |
| | result = subprocess.run(["ollama", "list"], capture_output=True, text=True) |
| | if result.returncode != 0: |
| | print("❌ Ollama not installed or not running") |
| | return False |
| | except FileNotFoundError: |
| | print("❌ Ollama command not found") |
| | return False |
| |
|
| | model_name = "my-custom-model" |
| |
|
| | |
| | if model_name not in result.stdout: |
| | print(f"⚠️ Model '{model_name}' not found in Ollama") |
| | print("Create it first:") |
| | print("1. ollama create my-custom-model -f Modelfile") |
| | return False |
| |
|
| | print(f"✅ Found model: {model_name}") |
| |
|
| | |
| | test_prompts = [ |
| | "Cześć! Kim jesteś?", |
| | "Jak zoptymalizować kod Python?", |
| | "Co to jest machine learning?" |
| | ] |
| |
|
| | for i, prompt in enumerate(test_prompts, 1): |
| | print(f"\n--- Ollama Test {i}/3: {prompt[:30]}... ---") |
| |
|
| | try: |
| | |
| | cmd = ["ollama", "run", model_name, prompt] |
| | result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) |
| |
|
| | if result.returncode == 0: |
| | print("✅ Ollama CLI response successful") |
| | print("Response preview:", result.stdout[:200] + "..." if len(result.stdout) > 200 else result.stdout) |
| | else: |
| | print(f"❌ Ollama CLI error: {result.stderr}") |
| | continue |
| |
|
| | except subprocess.TimeoutExpired: |
| | print("⏰ Ollama timeout") |
| | continue |
| | except Exception as e: |
| | print(f"❌ Ollama exception: {e}") |
| | continue |
| |
|
| | |
| | print("\n🌐 Testing Ollama API...") |
| | try: |
| | api_url = "http://localhost:11434/api/generate" |
| | test_data = { |
| | "model": model_name, |
| | "prompt": "Hello! Test API call.", |
| | "stream": False |
| | } |
| |
|
| | response = requests.post(api_url, json=test_data, timeout=60) |
| | if response.status_code == 200: |
| | data = response.json() |
| | print("✅ Ollama API response successful") |
| | print("API Response:", data.get('response', 'No response field')[:100]) |
| | else: |
| | print(f"❌ API Error: {response.status_code}") |
| | return False |
| |
|
| | except requests.exceptions.RequestException as e: |
| | print(f"❌ API Request failed: {e}") |
| | return False |
| |
|
| | return True |
| |
|
| |
|
| | def benchmark_model(): |
| | """Simple benchmark of the model""" |
| | print("\n📊 Running simple benchmark...") |
| |
|
| | model_file = "my_custom_model.gguf" |
| | if not os.path.exists(model_file): |
| | print("❌ Model file not found for benchmark") |
| | return |
| |
|
| | |
| | file_size = os.path.getsize(model_file) / (1024 ** 3) |
| | print(f"📁 Model size: {file_size:.2f} GB") |
| |
|
| | |
| | benchmark_prompt = "Explain artificial intelligence in simple terms." |
| |
|
| | llamacpp_main = "./llama.cpp/main" |
| | if os.path.exists(llamacpp_main): |
| | print("⏱️ Timing generation speed...") |
| |
|
| | cmd = [ |
| | llamacpp_main, |
| | "-m", model_file, |
| | "-p", benchmark_prompt, |
| | "-n", "100", |
| | "--temp", "0.7" |
| | ] |
| |
|
| | start_time = time.time() |
| | try: |
| | result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) |
| | end_time = time.time() |
| |
|
| | if result.returncode == 0: |
| | duration = end_time - start_time |
| | |
| | tokens = len(result.stdout.split()) |
| | tokens_per_second = tokens / duration if duration > 0 else 0 |
| |
|
| | print(f"⚡ Generation time: {duration:.2f} seconds") |
| | print(f"🚀 Speed: ~{tokens_per_second:.1f} tokens/second") |
| | print(f"📝 Generated tokens: ~{tokens}") |
| | else: |
| | print("❌ Benchmark failed") |
| | except subprocess.TimeoutExpired: |
| | print("⏰ Benchmark timeout") |
| |
|
| |
|
| | def main(): |
| | """Main test runner""" |
| | print("🧪 Custom Model Test Suite") |
| | print("=" * 40) |
| |
|
| | |
| | print("🔍 Checking prerequisites...") |
| |
|
| | required_files = [ |
| | "my_custom_model.gguf", |
| | "./llama.cpp/main", |
| | "Modelfile" |
| | ] |
| |
|
| | missing_files = [f for f in required_files if not os.path.exists(f)] |
| |
|
| | if missing_files: |
| | print("❌ Missing required files:") |
| | for f in missing_files: |
| | print(f" • {f}") |
| | print("\nRun these commands first:") |
| | print("1. python create_custom_model.py # fine-tune model") |
| | print("2. ./convert_to_gguf.sh # convert to GGUF") |
| | print("3. ollama create my-custom-model -f Modelfile # import to Ollama") |
| | return |
| |
|
| | print("✅ All required files found") |
| |
|
| | |
| | tests_passed = 0 |
| | total_tests = 3 |
| |
|
| | |
| | if test_llamacpp_direct(): |
| | tests_passed += 1 |
| | print("✅ llama.cpp test PASSED") |
| | else: |
| | print("❌ llama.cpp test FAILED") |
| |
|
| | |
| | if test_ollama_integration(): |
| | tests_passed += 1 |
| | print("✅ Ollama test PASSED") |
| | else: |
| | print("❌ Ollama test FAILED") |
| |
|
| | |
| | benchmark_model() |
| | tests_passed += 1 |
| |
|
| | |
| | print("\n" + "=" * 40) |
| | print(f"🎯 Test Results: {tests_passed}/{total_tests} passed") |
| |
|
| | if tests_passed == total_tests: |
| | print("🎉 All tests passed! Your custom model is ready!") |
| | print("\n🚀 Next steps:") |
| | print("• ollama push my-custom-model # Share with the world") |
| | print("• Integrate into your applications") |
| | print("• Fine-tune further with more data") |
| | else: |
| | print("⚠️ Some tests failed. Check the output above.") |
| |
|
| | |
| | print("\n📚 Usage Examples:") |
| | print("# Ollama CLI:") |
| | print("ollama run my-custom-model 'Your question here'") |
| | print("\n# Ollama API:") |
| | print("curl -X POST http://localhost:11434/api/generate \\") |
| | print(" -H 'Content-Type: application/json' \\") |
| | print(" -d '{\"model\": \"my-custom-model\", \"prompt\": \"Hello!\"}'") |
| |
|
| | print("\n# Python integration:") |
| | print("import ollama") |
| | print("response = ollama.chat(model='my-custom-model', messages=[") |
| | print(" {'role': 'user', 'content': 'Hello!'}])") |
| |
|
| |
|
| | if __name__ == "__main__": |
| | main() |