CataLlama-Chat / app.py
laurentiubp's picture
Update app.py
0020caa verified
raw
history blame
6.77 kB
import os
from threading import Thread
from typing import Iterator
import gradio as gr
import spaces
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
MAX_INPUT_TOKEN_LENGTH = 8192
EXAMPLE_ARTICLE_SUMMARY = """Fes un breu resum de l'article següent:\n\n
Al llarg de l’estiu es programen més de dues-centes activitats a la ciutat, entre festes populars, esportives i culturals. Per garantir el bon funcionament de la vida veïnal, gairebé sis-cents professionals reforçaran diversos dispositius municipals.
La seguretat ciutadana a l’espai públic es millora amb la incorporació de dos-cents agents més als dispositius de la Guàrdia Urbana. Es dedicaran sobretot a evitar o sancionar les conductes incíviques, prevenir la contaminació acústica, especialment a la nit, i controlar els horaris, l’aforament i la ubicació de bars i terrasses.
A més, per prevenir les violències masclistes, s’incrementen els itineraris segurs i els punts lila en zones d’alta afluència de persones, tant de dia com de nit, i s’establiran dispositius específics per Sant Joan, la Mercè i les festes majors dels barris.
Un espai públic net i de qualitat
Els serveis de neteja es reforcen amb 85 equips i 288 professionals addicionals. Les tasques que s’intensificaran són les següents:
La neteja amb aigua de vies principals, eixos comercials i la zona del litoral.
El buidatge de papereres.
La neteja de parcs i jardins a les tardes.
La retirada de residus voluminosos.
La neteja de contenidors.
Un total de 70 agents cívics promouran el bon ús de l’espai públic. Enguany s’incrementaran les tasques per detectar la gestió inadequada dels residus.
A més, durant l’estiu es mantenen els 36 equips dedicats a la neteja de pintades i retirada d’adhesius.
Aquesta feina s’executa, de manera planificada, en zones on s’ha detectat un grau alt d’incidències d’aquest tipus d’incivisme i, segons les necessitats, als espais que notifiquin la ciutadania o la GUB, entre altres.
Les platges, a punt per al bany
La temporada alta de platges comença dissabte, 25 de maig. S’activaran tots els serveis habituals de salvament i socorrisme, bany assistit, informadors, neteja manual de la sorra i neteja de la superfície del mar.
El Centre de la Platja oferirà activitats divulgatives i familiars, i també obrirà l’àrea d’esbarjo per a gossos de la platja de Llevant.
Bombers de Barcelona activa un dispositiu especial al litoral per a actuacions de rescat, assistència urgent i tasques de prevenció.
Altes temperatures: dispositius alerta
A la precampanya forestal dels Bombers a Collserola, que va començar a mitjan abril, s’afegeix l’activació del Parc de Vallvidrera.
En clau social, el Centre d’Urgències i Emergències Socials de Barcelona (CUESB) serà el punt referent d’atenció social, i els refugis climàtics, escoles, equipaments i parcs, entre altres, s’obriran a la ciutadania per fer front a la calor.
"""
DESCRIPTION = """\
# CataLlama-v0.1-Instruct-DPO
This Space demonstrates model [CataLlama-v0.1-Instruct-DPO](https://huggingface.co/catallama/CataLlama-v0.1-Instruct-DPO).
CataLlama is a fine-tune of Llama-3-8B to enhance it's proficiency on the Catalan Language.
The model is capable of performing the following **tasks in Catalan**:
- Translation from English to Catalan and Catalan to English
- Summarization - both short form and long form
- Information extraction (suitable for RAG)
- Named Entity Recognition (NER)
- Open question answering
- Sentiment analysis
"""
LICENSE = """\
As a derivate work of [Meta-Llama-3-8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B) by Meta, this demo is governed by the original [llama-3 license](https://llama.meta.com/llama3/license)
"""
if not torch.cuda.is_available():
DESCRIPTION += "\n<p>Running on CPU 🥶 This demo does not work on CPU.</p>"
if torch.cuda.is_available():
model_id = "catallama/CataLlama-v0.1-Instruct-DPO"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_id)
@spaces.GPU(duration=120)
def generate(
message: str,
chat_history: list[tuple[str, str]],
system_prompt: str,
max_new_tokens: int,
temperature: float,
top_p: float,
) -> Iterator[str]:
conversation = []
if system_prompt:
conversation.append({"role": "system", "content": system_prompt})
for user, assistant in chat_history:
conversation.extend([{"role": "user", "content": user}, {"role": "assistant", "content": assistant}])
conversation.append({"role": "user", "content": message})
input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
gr.Warning(f"Trimmed input from conversation as it was longer than {MAX_INPUT_TOKEN_LENGTH} tokens.")
input_ids = input_ids.to(model.device)
streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
generate_kwargs = dict(
{"input_ids": input_ids},
streamer=streamer,
max_new_tokens=max_new_tokens,
do_sample=True,
top_p=top_p,
temperature=temperature,
)
t = Thread(target=model.generate, kwargs=generate_kwargs)
t.start()
outputs = []
for text in streamer:
outputs.append(text)
yield "".join(outputs)
chat_interface = gr.ChatInterface(
fn=generate,
additional_inputs=[
gr.Textbox(
value="Ets un chatbot amigable. Responeu preguntes i ajudeu els usuaris.",
label="System message",
lines=6
),
gr.Slider(
minimum=1,
maximum=2048,
value=1024,
step=256,
label="Max new tokens"
),
gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.3,
step=0.05,
label="Temperature"
),
gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.90,
step=0.05,
label="Top-p (nucleus sampling)",
),
],
examples=[
["A quina velocitat poden volar els cocodrils?"],
["Explica pas a pas com resoldre l'equació següent: 2x + 10 = 0"],
["Pot Donald Trump sopar amb Juli Cèsar?"],
[EXAMPLE_ARTICLE_SUMMARY]
],
)
with gr.Blocks(css="style.css") as demo:
gr.Markdown(DESCRIPTION)
chat_interface.render()
gr.Markdown(LICENSE)
if __name__ == "__main__":
demo.queue(max_size=20).launch()