From f84ca4b51757ad7ff1df2ac409578960c05914e3 Mon Sep 17 00:00:00 2001 From: Leonyx Date: Fri, 1 Aug 2025 19:28:06 +0200 Subject: [PATCH] code updated to support gpu --- .../predicted_plant_growth.jpg | Bin 0 -> 63736 bytes testLLMinteraction1plant/script.py | 244 +++++++++++++++--- 2 files changed, 211 insertions(+), 33 deletions(-) create mode 100644 testLLMinteraction1plant/predicted_plant_growth.jpg diff --git a/testLLMinteraction1plant/predicted_plant_growth.jpg b/testLLMinteraction1plant/predicted_plant_growth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7961cd1e9c0a8ab7d124d424770d1d1d2de56f4f GIT binary patch literal 63736 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 max_memory: + max_memory = memory + device_id = i + torch.cuda.set_device(device_id) + print(f"๐Ÿ”„ RTX 3060 not found, using GPU {device_id} with most memory") + + device = f"cuda:{device_id}" + + # Display selected GPU info + selected_gpu = torch.cuda.get_device_name(device_id) + selected_memory = torch.cuda.get_device_properties(device_id).total_memory / 1024**3 + print(f"๐Ÿš€ Selected GPU: {selected_gpu}") + print(f"๐Ÿ’พ GPU Memory: {selected_memory:.1f} GB") + + # Clear any existing GPU cache + torch.cuda.empty_cache() + + # Set memory allocation strategy for better performance + torch.cuda.set_per_process_memory_fraction(0.85, device_id) # Use 85% of GPU memory + print(f"๐Ÿ”ง Set memory fraction to 85% for optimal performance") + + else: + device = "cpu" + print("โš ๏ธ No GPU available, using CPU (will be slower)") + + return device def load_image_model(self): - """Load the image transformation model""" - print("Loading Stable Diffusion model...") - self.image_model = StableDiffusionInstructPix2PixPipeline.from_pretrained( - "timbrooks/instruct-pix2pix", - torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32 - ) - if torch.cuda.is_available(): - self.image_model = self.image_model.to("cuda") - print("Model loaded successfully!") + """Load the image transformation model with RTX 3060 optimization""" + print("๐Ÿ”„ Loading Stable Diffusion model...") + print(f"๐Ÿ“ Device: {self.device}") + + try: + # Load model with appropriate precision based on device + if "cuda" in self.device: + print("๐Ÿš€ Loading model with RTX 3060 GPU acceleration...") + + # For RTX 3060 (8GB VRAM), use optimized settings + self.image_model = StableDiffusionInstructPix2PixPipeline.from_pretrained( + "timbrooks/instruct-pix2pix", + torch_dtype=torch.float16, # Use half precision for RTX 3060 + use_safetensors=True, + safety_checker=None, + requires_safety_checker=False, + variant="fp16" # Specifically request FP16 variant + ) + + # Move model to the specific GPU + self.image_model = self.image_model.to(self.device) + + # RTX 3060 specific optimizations + try: + self.image_model.enable_xformers_memory_efficient_attention() + print("โœ… XFormers memory efficient attention enabled for RTX 3060") + except Exception as e: + print(f"โš ๏ธ XFormers not available: {e}") + print("๐Ÿ’ก Consider installing xformers for better RTX 3060 performance") + + # Enable model CPU offload for RTX 3060's 8GB VRAM + self.image_model.enable_model_cpu_offload() + print("โœ… Model CPU offload enabled (important for RTX 3060's 8GB VRAM)") + + # Enable VAE slicing for lower memory usage + self.image_model.enable_vae_slicing() + print("โœ… VAE slicing enabled for memory efficiency") + + # Enable attention slicing for RTX 3060 + self.image_model.enable_attention_slicing(1) + print("โœ… Attention slicing enabled for RTX 3060") + + else: + print("๐ŸŒ Loading model for CPU inference...") + self.image_model = StableDiffusionInstructPix2PixPipeline.from_pretrained( + "timbrooks/instruct-pix2pix", + torch_dtype=torch.float32, # Use full precision for CPU + use_safetensors=True, + safety_checker=None, + requires_safety_checker=False + ) + self.image_model = self.image_model.to(self.device) + + print("โœ… Model loaded successfully on RTX 3060!") + + # Display memory usage + if "cuda" in self.device: + device_id = int(self.device.split(':')[-1]) if ':' in self.device else 0 + allocated = torch.cuda.memory_allocated(device_id) / 1024**3 + cached = torch.cuda.memory_reserved(device_id) / 1024**3 + print(f"๐Ÿ“Š GPU Memory - Allocated: {allocated:.2f} GB, Cached: {cached:.2f} GB") + + except Exception as e: + print(f"โŒ Error loading model: {e}") + print("๐Ÿ’ก This might be due to insufficient GPU memory or missing dependencies") + print("๐Ÿ’ก RTX 3060 has 8GB VRAM - try reducing image size if needed") + raise e def get_weather_forecast(self, lat, lon, days=7): """Get weather forecast from Open-Meteo API using official client""" @@ -161,71 +277,133 @@ class PlantPredictor: return prompt def transform_plant_image(self, image_path, prompt, num_inference_steps=20): - """Transform plant image based on weather conditions""" + """Transform plant image based on weather conditions with GPU acceleration""" if self.image_model is None: self.load_image_model() try: # Load and prepare image + print(f"๐Ÿ“ธ Loading image: {image_path}") image = Image.open(image_path).convert("RGB") # Resize if too large (for memory efficiency) + original_size = image.size if max(image.size) > 1024: image.thumbnail((1024, 1024), Image.Resampling.LANCZOS) + print(f"๐Ÿ“ Resized image from {original_size} to {image.size}") - # Transform image - print(f"Transforming image with prompt: {prompt}") - result = self.image_model( - prompt, - image=image, - num_inference_steps=num_inference_steps, - image_guidance_scale=1.5, - guidance_scale=7.5 - ).images[0] + # Clear GPU cache before generation + if "cuda" in self.device: + torch.cuda.empty_cache() + device_id = int(self.device.split(':')[-1]) if ':' in self.device else 0 + available_memory = torch.cuda.get_device_properties(device_id).total_memory - torch.cuda.memory_reserved(device_id) + print(f"๐Ÿงน GPU memory cleared. Available: {available_memory / 1024**3:.2f} GB") + # Transform image with optimized settings for RTX 3060 + print(f"๐ŸŽจ Transforming image with prompt: {prompt[:100]}...") + + # Set generator for reproducible results + device_for_generator = self.device if "cuda" in self.device else "cpu" + generator = torch.Generator(device=device_for_generator).manual_seed(42) + + if "cuda" in self.device: + # Use autocast for mixed precision on RTX 3060 + with torch.autocast(device_type="cuda", dtype=torch.float16): + result = self.image_model( + prompt, + image=image, + num_inference_steps=num_inference_steps, + image_guidance_scale=1.5, + guidance_scale=7.5, + generator=generator + ).images[0] + else: + # CPU inference without autocast + result = self.image_model( + prompt, + image=image, + num_inference_steps=num_inference_steps, + image_guidance_scale=1.5, + guidance_scale=7.5, + generator=generator + ).images[0] + + # Clean up GPU memory after generation + if "cuda" in self.device: + torch.cuda.empty_cache() + print("๐Ÿงน RTX 3060 memory cleaned up after generation") + + print("โœ… Image transformation completed!") return result + except torch.cuda.OutOfMemoryError: + print("โŒ RTX 3060 out of memory!") + print("๐Ÿ’ก Try reducing image size or using fewer inference steps") + print("๐Ÿ’ก RTX 3060 has 8GB VRAM - large images may exceed this limit") + if "cuda" in self.device: + torch.cuda.empty_cache() + return None except Exception as e: - print(f"Error transforming image: {e}") + print(f"โŒ Error transforming image: {e}") + if "cuda" in self.device: + torch.cuda.empty_cache() return None def predict_plant_growth(self, image_path, lat, lon, output_path="predicted_plant.jpg", days=7): - """Complete pipeline: weather + image transformation""" + """Complete pipeline: weather + image transformation with RTX 3060 acceleration""" - print(f"Starting plant prediction for coordinates: {lat}, {lon}") - print(f"Analyzing {days} days of weather data...") + print(f"๐ŸŒฑ Starting plant prediction for coordinates: {lat}, {lon}") + print(f"๐Ÿ“… Analyzing {days} days of weather data...") + print(f"๐Ÿ–ฅ๏ธ Using device: {self.device}") # Step 1: Get weather data using official Open-Meteo client - print("Fetching weather data with caching and retry...") + print("๐ŸŒค๏ธ Fetching weather data with caching and retry...") weather_df, response_info = self.get_weather_forecast(lat, lon, days) if weather_df is None: - print("Failed to get weather data") + print("โŒ Failed to get weather data") return None - print(f"Weather data retrieved for {len(weather_df)} days") - print("\nWeather Overview:") + print(f"โœ… Weather data retrieved for {len(weather_df)} days") + print("\n๐Ÿ“Š Weather Overview:") print(weather_df[['date', 'temperature_2m_max', 'temperature_2m_min', 'precipitation_sum', 'sunshine_duration']].head()) # Step 2: Analyze weather for plants plant_conditions = self.analyze_weather_for_plants(weather_df) - print(f"\nPlant-specific weather analysis: {plant_conditions}") + print(f"\n๐Ÿ”ฌ Plant-specific weather analysis: {plant_conditions}") # Step 3: Create transformation prompt prompt = self.create_transformation_prompt(plant_conditions) - print(f"\nGenerated transformation prompt: {prompt}") + print(f"\n๐Ÿ“ Generated transformation prompt: {prompt}") + + # Step 4: Transform image with RTX 3060 acceleration + print(f"\n๐ŸŽจ Transforming plant image using RTX 3060...") + + import time + start_time = time.time() - # Step 4: Transform image - print("\nTransforming plant image...") result_image = self.transform_plant_image(image_path, prompt) + end_time = time.time() + generation_time = end_time - start_time + if result_image: result_image.save(output_path) - print(f"Plant growth prediction saved to: {output_path}") + print(f"โœ… Plant growth prediction saved to: {output_path}") + print(f"โฑ๏ธ Generation time with RTX 3060: {generation_time:.2f} seconds") + + # Show RTX 3060 memory usage if available + if "cuda" in self.device: + device_id = int(self.device.split(':')[-1]) if ':' in self.device else 0 + memory_used = torch.cuda.max_memory_allocated(device_id) / 1024**3 + total_memory = torch.cuda.get_device_properties(device_id).total_memory / 1024**3 + print(f"๐Ÿ“Š RTX 3060 Peak Memory Usage: {memory_used:.2f} GB / {total_memory:.1f} GB ({memory_used/total_memory*100:.1f}%)") + torch.cuda.reset_peak_memory_stats(device_id) + return result_image, plant_conditions, weather_df else: - print("Failed to transform image") + print("โŒ Failed to transform image on RTX 3060") return None # Example usage