Spaces:
Sleeping
Sleeping
| import spaces | |
| import gradio as gr | |
| import torch | |
| from transformers import pipeline | |
| from PIL import Image | |
| import time | |
| import traceback | |
| # Global model storage for Zero GPU compatibility | |
| models = {} | |
| def load_model_on_gpu(model_choice): | |
| """Load GLM model on GPU - separated for clarity.""" | |
| model_map = { | |
| "GLM-4.5V-AWQ": "QuantTrio/GLM-4.5V-AWQ", | |
| "GLM-4.5V-FP8": "zai-org/GLM-4.5V-FP8", | |
| "GLM-4.5V": "zai-org/GLM-4.5V" | |
| } | |
| model_name = model_map.get(model_choice) | |
| if not model_name: | |
| return False, f"Unknown model: {model_choice}" | |
| if model_name in models: | |
| return True, f"β {model_choice} already loaded" | |
| try: | |
| pipe = pipeline( | |
| "image-text-to-text", | |
| model=model_name, | |
| device_map="auto", | |
| torch_dtype=torch.float16, | |
| trust_remote_code=True | |
| ) | |
| models[model_name] = pipe | |
| return True, f"β {model_choice} loaded successfully" | |
| except Exception as e: | |
| return False, f"β Failed to load {model_choice}: {str(e)[:200]}" | |
| def generate_code(image, model_choice, prompt_style): | |
| """Generate CADQuery code - main GPU function.""" | |
| if image is None: | |
| return "β Please upload an image first." | |
| # Create prompts | |
| prompts = { | |
| "Simple": "Generate CADQuery Python code for this 3D model:", | |
| "Detailed": "Analyze this 3D CAD model and generate Python CADQuery code.\n\nRequirements:\n- Import cadquery as cq\n- Store result in 'result' variable\n- Use proper CADQuery syntax\n\nCode:", | |
| "Chain-of-Thought": "Analyze this 3D CAD model step by step:\n\nStep 1: Identify the basic geometry\nStep 2: Note any features\nStep 3: Generate clean CADQuery Python code\n\n```python\nimport cadquery as cq\n\n# Generated code:" | |
| } | |
| try: | |
| # Load model if needed | |
| model_map = { | |
| "GLM-4.5V-AWQ": "QuantTrio/GLM-4.5V-AWQ", | |
| "GLM-4.5V-FP8": "zai-org/GLM-4.5V-FP8", | |
| "GLM-4.5V": "zai-org/GLM-4.5V" | |
| } | |
| model_name = model_map[model_choice] | |
| if model_name not in models: | |
| pipe = pipeline( | |
| "image-text-to-text", | |
| model=model_name, | |
| device_map="auto", | |
| torch_dtype=torch.float16, | |
| trust_remote_code=True | |
| ) | |
| models[model_name] = pipe | |
| else: | |
| pipe = models[model_name] | |
| # Generate | |
| messages = [{ | |
| "role": "user", | |
| "content": [ | |
| {"type": "image", "image": image}, | |
| {"type": "text", "text": prompts[prompt_style]} | |
| ] | |
| }] | |
| result = pipe(messages, max_new_tokens=512, temperature=0.7) | |
| if isinstance(result, list) and len(result) > 0: | |
| generated_text = result[0].get("generated_text", str(result)) | |
| else: | |
| generated_text = str(result) | |
| # Simple code extraction | |
| code = generated_text.strip() | |
| if "```python" in code: | |
| start = code.find("```python") + 9 | |
| end = code.find("```", start) | |
| if end > start: | |
| code = code[start:end].strip() | |
| if "import cadquery" not in code: | |
| code = "import cadquery as cq\n\n" + code | |
| return f"""## π― Generated CADQuery Code | |
| ```python | |
| {code} | |
| ``` | |
| ## π Info | |
| - **Model**: {model_choice} | |
| - **Prompt**: {prompt_style} | |
| - **Device**: {"GPU" if torch.cuda.is_available() else "CPU"} | |
| ## π§ Usage | |
| ```bash | |
| pip install cadquery | |
| python your_script.py | |
| ``` | |
| """ | |
| except Exception as e: | |
| return f"β **Generation Failed**: {str(e)[:500]}" | |
| def test_model(model_choice): | |
| """Test model loading.""" | |
| success, message = load_model_on_gpu(model_choice) | |
| return f"## Test Result\n\n{message}" | |
| def system_info(): | |
| """Get system info.""" | |
| info = f"""## π₯οΈ System Information | |
| - **CUDA Available**: {torch.cuda.is_available()} | |
| - **CUDA Devices**: {torch.cuda.device_count() if torch.cuda.is_available() else 0} | |
| - **PyTorch Version**: {torch.__version__} | |
| - **Device**: {"GPU" if torch.cuda.is_available() else "CPU"} | |
| """ | |
| return info | |
| # Create interface | |
| with gr.Blocks(title="GLM-4.5V CAD Generator", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # π§ GLM-4.5V CAD Generator | |
| Generate CADQuery Python code from 3D CAD model images using GLM-4.5V models! | |
| **Models**: GLM-4.5V-AWQ (fastest) | GLM-4.5V-FP8 (balanced) | GLM-4.5V (best quality) | |
| """) | |
| with gr.Tab("π Generate"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| image_input = gr.Image(type="pil", label="Upload CAD Model Image") | |
| model_choice = gr.Dropdown( | |
| choices=["GLM-4.5V-AWQ", "GLM-4.5V-FP8", "GLM-4.5V"], | |
| value="GLM-4.5V-AWQ", | |
| label="Select Model" | |
| ) | |
| prompt_style = gr.Dropdown( | |
| choices=["Simple", "Detailed", "Chain-of-Thought"], | |
| value="Chain-of-Thought", | |
| label="Prompt Style" | |
| ) | |
| generate_btn = gr.Button("π Generate CADQuery Code", variant="primary") | |
| with gr.Column(): | |
| output = gr.Markdown("Upload an image and click Generate!") | |
| generate_btn.click( | |
| fn=generate_code, | |
| inputs=[image_input, model_choice, prompt_style], | |
| outputs=output | |
| ) | |
| with gr.Tab("π§ͺ Test"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| test_model_choice = gr.Dropdown( | |
| choices=["GLM-4.5V-AWQ", "GLM-4.5V-FP8", "GLM-4.5V"], | |
| value="GLM-4.5V-AWQ", | |
| label="Model to Test" | |
| ) | |
| test_btn = gr.Button("π§ͺ Test Model") | |
| with gr.Column(): | |
| test_output = gr.Markdown("Click Test Model to check loading.") | |
| test_btn.click(fn=test_model, inputs=test_model_choice, outputs=test_output) | |
| with gr.Tab("βοΈ System"): | |
| info_display = gr.Markdown() | |
| refresh_btn = gr.Button("π Refresh") | |
| demo.load(fn=system_info, outputs=info_display) | |
| refresh_btn.click(fn=system_info, outputs=info_display) | |
| if __name__ == "__main__": | |
| print("π Starting GLM-4.5V CAD Generator...") | |
| print(f"CUDA available: {torch.cuda.is_available()}") | |
| demo.launch(share=True, show_error=True) |