k3ybladewielder commited on
Commit
046188a
·
verified ·
1 Parent(s): 088d871

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -0
app.py CHANGED
@@ -77,6 +77,82 @@ def get_llm():
77
  return HuggingFacePipeline(pipeline=text_pipeline)
78
 
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
  def get_embedding_model():
82
  return HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL, cache_folder=CACHE_FOLDER)
 
77
  return HuggingFacePipeline(pipeline=text_pipeline)
78
 
79
 
80
+ def get_llm():
81
+ """Carrega o LLM quantizado localmente usando bitsandbytes e um pipeline com chat template."""
82
+ # Atualizando o nome do modelo para carregar o tokenizer correto,
83
+ # mesmo que o arquivo GGUF seja de outro repo.
84
+ # O tokenizer ainda deve ser compatível com o modelo base "google/gemma-2b-it".
85
+ TOKENIZER_MODEL = "google/gemma-2b-it"
86
+ model_path = os.path.join(CACHE_FOLDER, LOCAL_MODEL_FILE)
87
+ logger.info(f"Carregando LLM quantizado localmente: {LOCAL_MODEL_FILE}")
88
+
89
+ try:
90
+ # Configuração da quantização com bitsandbytes
91
+ # `load_in_4bit=True` habilita a quantização de 4 bits
92
+ # `bnb_4bit_quant_type` define o tipo de quantização (fp4 ou nf4)
93
+ # `bnb_4bit_compute_dtype` define o tipo de dados para o cálculo (float16 é comum para GPUs)
94
+ quantization_config = BitsAndBytesConfig(
95
+ load_in_4bit=True,
96
+ bnb_4bit_quant_type="nf4",
97
+ bnb_4bit_compute_dtype=torch.bfloat16,
98
+ llm_int8_threshold=6.0, # Adicionado para compatibilidade
99
+ llm_int8_skip_modules=None, # Adicionado para compatibilidade
100
+ llm_int8_enable_fp32_cpu_offload=False # Adicionado para compatibilidade
101
+ )
102
+
103
+ # Carregando o tokenizer e o modelo, aplicando a quantização
104
+ tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_MODEL, cache_dir=CACHE_FOLDER)
105
+ # O modelo Gemma-2b-it possui um template de chat embutido
106
+ if tokenizer.chat_template is None:
107
+ logger.warning("O modelo não tem um template de chat. Usando o template padrão.")
108
+ tokenizer.chat_template = "{% for message in messages %}{% if message['role'] == 'user' %}{{ '[User]: ' + message['content'] + '\n\n' }}{% else %}{{ '[Assistant]: ' + message['content'] + '\n\n' }}{% endif %}{% endfor %}"
109
+
110
+
111
+ # O modelo a ser carregado agora é o arquivo GGUF local.
112
+ # No entanto, bitsandbytes é geralmente usado para carregar modelos transformers
113
+ # não GGUF. Para GGUF, você geralmente usaria uma biblioteca como `ctransformers`
114
+ # ou `llama-cpp-python`.
115
+ # Como o código original usava bitsandbytes com um nome de arquivo GGUF,
116
+ # assumirei que a intenção era carregar um modelo compatível com transformers/bitsandbytes,
117
+ # talvez com um nome de arquivo .safetensors ou .bin.
118
+ # Vou reverter para carregar o modelo diretamente do repo original
119
+ # "google/gemma-2b-it" usando bitsandbytes, já que o arquivo GGUF
120
+ # não é o formato esperado para bitsandbytes/transformers.
121
+ # Se a intenção REALMENTE for usar o arquivo GGUF, a abordagem de carregamento
122
+ # precisará ser completamente reescrita usando uma biblioteca apropriada (ex: ctransformers).
123
+
124
+ logger.warning("Detectado uso de bitsandbytes com nome de arquivo .gguf. Bitsandbytes é para modelos transformers (ex: .safetensors, .bin). Revertendo para carregar o modelo diretamente do repo original 'google/gemma-2b-it' com bitsandbytes.")
125
+
126
+ model = AutoModelForCausalLM.from_pretrained(
127
+ TOKENIZER_MODEL, # Carregando do repo original para usar bitsandbytes
128
+ cache_dir=CACHE_FOLDER,
129
+ device_map="auto", # Tenta usar a GPU, se disponível
130
+ quantization_config=quantization_config # Adicionando a configuração de quantização
131
+ )
132
+
133
+ # Criando a pipeline de geração de texto
134
+ text_pipeline = pipeline(
135
+ "text-generation",
136
+ model=model,
137
+ tokenizer=tokenizer,
138
+ max_new_tokens=1024,
139
+ temperature=0.3,
140
+ # Parâmetros de parada para evitar que o modelo continue a gerar após a resposta
141
+ # Note: stop_sequence pode não ser universalmente suportado por todas as pipelines/modelos
142
+ # dependendo da implementação específica.
143
+ eos_token_id=tokenizer.eos_token_id # Usar EOS token é mais robusto
144
+ )
145
+
146
+ # Retornando a LLM da LangChain que usa a pipeline
147
+ return HuggingFacePipeline(pipeline=text_pipeline)
148
+
149
+ except Exception as e:
150
+ logger.error(f"Erro ao carregar o modelo. Erro: {e}")
151
+ # Informar o usuário sobre a incompatibilidade potencial
152
+ if "bitsandbytes" in str(e).lower() and ".gguf" in LOCAL_MODEL_FILE.lower():
153
+ logger.error("Possível erro de incompatibilidade: bitsandbytes é usado para modelos transformers, não GGUF. Considere usar uma biblioteca como 'ctransformers' ou 'llama-cpp-python' para arquivos GGUF.")
154
+ raise e
155
+
156
 
157
  def get_embedding_model():
158
  return HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL, cache_folder=CACHE_FOLDER)