File size: 4,392 Bytes
a61da49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea0fa3e
 
 
 
d9b432f
 
 
 
 
 
 
ea0fa3e
 
d9b432f
 
ea0fa3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a61da49
d9b432f
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

import os
import gradio as gr
from transformers import pipeline

print("\n#### Example: Deploying a Simple LLM with Gradio to Hugging Face Spaces")
print("The following code demonstrates a simple LLM inference application using Gradio, which can be easily deployed to Hugging Face Spaces. For this example, we'll use a small, efficient model.")


# --- Step 1: Load the LLM --- #
# We'll use a small text generation model for demonstration purposes.
# For larger models, ensure your Hugging Face Space has sufficient GPU resources.
print("\nLoading text generation pipeline...")
# You might need to install 'accelerate' and 'bitsandbytes' for quantized models or faster inference
# !pip install -q accelerate bitsandbytes

# This model is small and runs well on CPU for basic demonstrations.
# For a more capable LLM, you'd choose models like 'google/gemma-2b-it' or 'TinyLlama/TinyLlama-1.1B-Chat-v1.0'
# but these would require a GPU runtime on your Space.

# For this example, let's pick a very small model for fast execution even on CPU.
# For a true LLM, consider a model like 'distilbert-base-uncased' for text classification or 'gpt2' for generation,
# though 'gpt2' can be slow without GPU.

# Let's use a simple sentiment analysis model as it's quick and illustrative.
# If a full text generation LLM is desired, 'gpt2' is a good choice if a GPU is available or patience is high.
# For a quick CPU example of a small text model, let's use a fill-mask pipeline.

# Fallback for LLM-like behavior with quick execution (e.g., fill-mask)
# A true 'text-generation' LLM would be 'gpt2' but it's slower.
# Using a small 'fill-mask' model to simulate interactive LLM-like behavior quickly.
# If you have GPU, you can switch to: pipeline("text-generation", model="gpt2")

try:
    # Attempt to load a text-generation model first
    generator = pipeline("text-generation", model="distilgpt2", device=0) # device=0 for GPU if available
    print("Using distilgpt2 for text generation.")
except Exception as e:
    print(f"Could not load distilgpt2 for text-generation, falling back to fill-mask: {e}")
    generator = pipeline("fill-mask", model="distilbert-base-uncased")
    print("Using distilbert-base-uncased for fill-mask.")

print("Model loaded.")

# --- Step 2: Define the LLM inference function --- #
def llm_inference(prompt):
    if generator.task == "text-generation":
        response = generator(prompt, max_new_tokens=50, num_return_sequences=1)
        return response[0]['generated_text']
    elif generator.task == "fill-mask":
        response = generator(prompt)
        # For fill-mask, return the top predicted token and its score
        top_prediction = response[0]
        return f"{prompt.replace('[MASK]', f'**{top_prediction['token_str']}**')} (Score: {top_prediction['score']:.2f})"

# --- Step 3: Create a Gradio Interface --- #
print("\nBuilding Gradio interface...")
if generator.task == "text-generation":
    interface = gr.Interface(
        fn=llm_inference,
        inputs=gr.Textbox(lines=2, placeholder="Enter your prompt here..."),
        outputs=gr.Textbox(lines=5),
        title="Simple LLM Chatbot (distilgpt2)",
        description="Enter a prompt and get text generated by a small LLM."
    )
else:
    interface = gr.Interface(
        fn=llm_inference,
        inputs=gr.Textbox(lines=2, placeholder="Enter a sentence with [MASK] to fill, e.g., 'The capital of France is [MASK].'"),
        outputs=gr.Textbox(lines=5),
        title="Masked Language Model (distilbert)",
        description="Enter a sentence with a [MASK] token to see the model's prediction."
    )

# --- Step 4: Launch the Gradio App --- #

import gradio as gr
from transformers import pipeline
import os
from huggingface_hub import login

# Authenticate with HF Hub
hf_token = os.getenv("HF_TOKEN")
if hf_token:
    login(token=hf_token)

# Load a small, efficient model

generator = pipeline("text-generation", model="distilgpt2", token=hf_token)

def generate_text(prompt):
    result = generator(prompt, max_length=50, num_return_sequences=1)
    return result[0]["generated_text"]

demo = gr.Interface(
    fn=generate_text,
    inputs="text",
    outputs="text",
    title="Simple LLM Demo",
    description="A lightweight text generation app using DistilGPT2."
)

# Keep the app alive on Hugging Face Spaces
demo.launch(server_name="0.0.0.0", server_port=7860)