análisis del modelo de pytorch

¿Cómo obtener la imagen dinámica de pytorch?

model = torch.jit.load("test.pth")
graph = model.graph.copy()
torch._C._jit_pass_inline(graph)
node_list = graph.nodes()

Después de cargar el modelo, obtenga el gráfico del modelo. Este gráfico es el gráfico dinámico requerido. El nodo de gráfico es el nodo de cálculo (ordenado) del gráfico de cálculo. Los parámetros relevantes de cada capa se pueden obtener del nodo de nodo. La posición relativa de cada parámetro debe encontrarse para la implementación de la operación.

Cabe señalar que debe usar _jit_pass_inline para expandir el submódulo del gráfico.

¿Cómo obtener el peso y otros parámetros de pytorch?

Para modelos no cuantitativos:

Se puede obtener a través de named_parameters o state_dict.

Para el modelo cuantitativo:

¡Finalmente lo encontré después de repetidos intentos y configuraciones de interfaz! ! !

a = 0
for model_name, module in model.named_modules():
    print(model_name)
    print(module)
    if a == 2:
        mod_c = module._c
        #print(mod_c.dump())
        param = module.__getattr__('_packed_params')
        print(param)
        print(type(param))
        print(dir(param))
        print(param._method_names())
        weight,bias = param.unpack()
        print(bias)
        break
    else:
        a = a + 1

Primero, puede ver el contenido de cada atributo del modelo para facilitar la posterior getattr directa. Este proceso se puede obtener a través del atributo _c, y luego volcar el valor del atributo obtenido para ver todo el contenido de cada submódulo, y luego puede obtener el deseado De los atributos.

Se encontraron los siguientes problemas durante el análisis:

1. ¿Cómo determinar el diseño de pesos?

La forma del tensor se puede obtener a través del atributo de forma, el valor en el tensor se puede obtener a través de Tensor.storage () y el diseño de datos se puede obtener a través de Tensor.layout. Es decir, el valor de este tensor está organizado por el diseño de .layout, no en el orden de la forma.

El diseño del modelo analítico es antorcha. A rayas, este diseño está organizado de acuerdo con el paso, esta explicación es todavía bastante vaga.

Suponiendo que la forma del peso de la convolución 3x3 es [32,3,3,3] (nchw), la información de zancada de cada dimensión se puede obtener a través de Tensor.stride (). La información de zancada del peso es [27,1,9,3] (nchw), lo que significa: cada paso n, la longitud del paso es 27, cada paso c, la longitud del paso es 1 y cada paso h, la longitud del paso es 9 , Para cada paso de w, la longitud del paso es 3. Esto significa que el orden de disposición es nhwc, por lo que debe convertirse de acuerdo con los requisitos del marco al analizar.

2. El peso es int8, y el marco analizado es uint8 ¿Cómo hacerlo aplicable al marco uint8?

Mire la implementación del cálculo de cuantificación: si el cálculo necesita restar el punto cero, es decir, use el valor valor-punto cero para participar en el cálculo al calcular, entonces puede agregar un 128 a todos los valores del peso (el valor mínimo de int8 es -128), Tienes que sumar 128 al valor del punto cero.

3. ¿Qué hacen las operaciones cuantitativa y cuantitativa?

Los datos almacenados en cada tensor cuantificado de pytorch son en realidad datos flotantes. Cuando los datos se obtienen a través del almacenamiento, se cuantificarán en datos int8 de acuerdo con la escala / punto cero.

Qué hace la operación cuantitativa: ingresar / escala + punto cero, convertir float en datos uint8, y luego descuantificar los datos uint8 y guardarlos: (input-zeropoint) * scale. Es decir, quant op realiza la cuantificación y descuantificación, convirtiendo un tensor flotante en un tensor de escala int8.

dequant op realiza una operación de cuantificación inversa: (entrada-punto cero) * escala

 

Supongo que te gusta

Origin blog.csdn.net/azheng_wen/article/details/109474763
Recomendado
Clasificación