Search code examples
huggingface-transformersstreamlit

Streamlit Unhashable TypeError when i use st.cache


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')

Solution

  • 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