Spaces:
Sleeping
Sleeping
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) | |
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() | |