Streamlit Unhashable TypeError when i use st.cache

Viewed 568

when i use the st.cache decorator to cash hugging-face transformer model i get

Unhashable TypeError

this is the code

from transformers import pipeline 
import streamlit as st 
from io import StringIO

@st.cache(hash_funcs={StringIO: StringIO.getvalue})
def model() :
    return pipeline("sentiment-analysis", model='akhooli/xlm-r-large-arabic-sent')
2 Answers

after searching in issues section in streamlit repo

i found that hashing argument is not required , just need to pass this argument

allow_output_mutation = True

This worked for me:

from transformers import pipeline 
import tokenizers
import streamlit as st 
import copy


@st.cache(hash_funcs={tokenizers.Tokenizer: lambda _: None, tokenizers.AddedToken: lambda _: None})
def get_model() :
    return pipeline("sentiment-analysis", model='akhooli/xlm-r-large-arabic-sent')

input = st.text_input('Text')
bt = st.button("Get Sentiment Analysis")

if bt and input:
    model = copy.deepcopy(get_model())
    st.write(model(input))

Note 1: calling the pipeline with input model(input) changes the model and we shouldn't change a cached value so we need to copy the model and run it on the copy.

Note 2: First run will load the model using the get_model function next run will use the chace.

Note 3: You can read more about Advanced caching in stremlit in thier documentation.

Output examples:

1

2

Related