| |
| """ |
| 🧪 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() |