Spaces:
Build error
Build error
| import os | |
| import time | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| from huggingface_hub import login | |
| # 🔹 Força depuração CUDA (caso seja erro de VRAM) | |
| os.environ["CUDA_LAUNCH_BLOCKING"] = "1" | |
| # 🔹 Obter Token do Hugging Face do ambiente | |
| HF_API_KEY = os.getenv("HF_API_KEY") | |
| if not HF_API_KEY: | |
| raise ValueError("❌ ERRO: Token Hugging Face não encontrado no ambiente.") | |
| # ✅ Fazer login no Hugging Face | |
| print("🔄 Conectando ao Hugging Face...") | |
| login(HF_API_KEY) | |
| print("✅ Conectado ao Hugging Face!") | |
| # 🔹 Nome do modelo treinado | |
| MODEL_NAME = "rwayz/tributario-llama-8b-v1" | |
| # 🔄 Carregar modelo e tokenizer | |
| print(f"🔄 Carregando modelo: {MODEL_NAME}...") | |
| start_time = time.time() | |
| try: | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_API_KEY) | |
| model = AutoModelForCausalLM.from_pretrained( | |
| MODEL_NAME, | |
| torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, # 🔹 Usa `fp16` na GPU para eficiência | |
| device_map="auto", # 🔹 Distribui automaticamente para a GPU (se disponível) | |
| use_cache=False, # 🔹 Necessário se foi treinado com `gradient_checkpointing` | |
| token=HF_API_KEY | |
| ) | |
| print(f"✅ Modelo carregado! Tempo: {time.time() - start_time:.2f}s") | |
| except Exception as e: | |
| print(f"❌ ERRO AO CARREGAR O MODELO: {str(e)}") | |
| exit() | |
| # 🔹 Definir `pad_token` caso esteja ausente | |
| if tokenizer.pad_token is None: | |
| tokenizer.pad_token = tokenizer.eos_token | |
| # 🔹 Pergunta padrão para teste | |
| pergunta = "Quais são os principais tributos aplicáveis a empresas no Brasil?" | |
| print("📝 Pergunta de teste:", pergunta) | |
| # 🔄 Tokenizar entrada | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| inputs = tokenizer(f"Pergunta: {pergunta}", return_tensors="pt").to(device) | |
| # 🔄 Liberar memória antes da inferência | |
| torch.cuda.empty_cache() | |
| # 🔄 Geração robusta de resposta | |
| print("🤖 Gerando resposta do modelo...") | |
| inference_start_time = time.time() | |
| try: | |
| with torch.no_grad(): | |
| output = model.generate( | |
| **inputs, | |
| max_length=256, | |
| do_sample=True, | |
| top_k=50, # Teste valores maiores | |
| top_p=0.95, # Teste valores mais altos | |
| temperature=0.7, # Aumente para diversificar respostas | |
| pad_token_id=tokenizer.pad_token_id | |
| ) | |
| # 🔹 Decodificar resposta | |
| resposta = tokenizer.decode(output[0], skip_special_tokens=True) | |
| print("✅ Resposta gerada! Tempo de inferência:", time.time() - inference_start_time, "s") | |
| print("\n📝 **Resposta do Modelo:**\n", resposta) | |
| except RuntimeError as e: | |
| print(f"❌ ERRO NA GERAÇÃO: {str(e)}") | |
| # 🔹 Se o erro for na GPU, tentar na CPU | |
| if "CUDA error" in str(e) or "inf" in str(e) or "nan" in str(e): | |
| print("🔄 Tentando rodar na CPU como fallback...") | |
| model.to("cpu") | |
| inputs = inputs.to("cpu") | |
| with torch.no_grad(): | |
| output = model.generate( | |
| **inputs, | |
| max_length=256, | |
| do_sample=True, | |
| top_k=30, | |
| top_p=0.85, | |
| temperature=0.5, | |
| pad_token_id=tokenizer.pad_token_id | |
| ) | |
| resposta = tokenizer.decode(output[0], skip_special_tokens=True) | |
| print("✅ Resposta gerada na CPU:") | |
| print(resposta) | |