Closed dmlls closed 3 years ago
Hemos utilizado el siguiente script para comparar los rendimientos de la versión antigua y la nueva:
import timeit
from text_encoding import SplitterEncoder as old
from text_encoding_new import SplitterEncoder as new
def wrapper(func, *args, **kwargs):
def wrapped():
return func(*args, **kwargs)
return wrapped
if __name__ == "__main__":
with open("article_6.txt", "r") as file:
text = " ".join(file.readlines())
print("Longitud del texto:", len(text), "caracteres.")
tk_old = old()
tk_new = new()
wrapped = wrapper(tk_old.encode, text)
print("Encoder antiguo:", timeit.timeit(wrapped, number=20), "segundos.")
wrapped = wrapper(tk_new.encode, text)
print("Encoder nuevo: ", timeit.timeit(wrapped, number=20), "segundos.")
La mejora es clara:
Longitud del texto: 119298 caracteres.
Encoder antiguo: 25.57345193799847 segundos.
Encoder nuevo: 7.182184395998775 segundos.
Al momento de escribir en la memoria la parte relativa a la codificación de texto, nos hemos dado cuenta de que la forma en la que dividíamos el texto se puede mejorar.
Anteriormente, realizábamos una aproximación del número de tókenes que tendría una frase una vez codificada. Si dicha aproximación había resultado incorrecta, teníamos que corregirla y ejecutar de nuevo el algoritmo, así hasta que fuera correcta. Esto lo hacíamos tratando de conseguir un algoritmo general, válido para cualquier modelo. Sin embargo, con la arquitectura de microservicios actual, cada encoder de cada modelo es un servicio por separado, por lo que podemos escribir dicho algoritmo de forma que se ajuste al funcionamiento concreto del modelo que estamos utilizando.
Por ello, dado que usamos el modelo T5, ajustaremos el algoritmo a la forma en la que dicho modelo codifica el texto. Esto nos permite calcular exactamente (es decir, sin aproximaciones, como sucedía anteriormente) el número de tókenes que le corresponderán a cada frase.
Además, dado que prácticamente hay que reescribir el código completo, intentaremos optimizarlo, ya de paso. Una mejora clara puede ser utilizar solo los índices de las frases (enteros) en vez de trabajar directamente con estas (strings).