Exemple #1
0
        public void Infer(layers.Quantize layer, QuantizeLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.MainMemoryInputAddress  = inputAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #2
0
        public void Infer(K210Upload layer, K210UploadLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.KPUMemoryMap[layer.Output];

            argument.MainMemoryInputAddress = inputAlloc.GetAddress();
            argument.KPUMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #3
0
        public void Infer(AveragePool2d layer, AveragePool2dLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.MainMemoryOutput;
            argument.MainMemoryInputAddress  = inputAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #4
0
        public void Infer(QuantizedAdd layer, QuantizedAddLayerArgument argument, InferenceContext context)
        {
            var inputAAlloc = context.MainMemoryMap[layer.InputA.Connection.From];
            var inputBAlloc = context.MainMemoryMap[layer.InputB.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.MainMemoryOutput;
            argument.MainMemoryInputAAddress = inputAAlloc.GetAddress();
            argument.MainMemoryInputBAddress = inputBAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #5
0
        public void Infer(Concatenation layer, ConcatenationLayerArgument argument, InferenceContext context)
        {
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.MainMemoryOutput;
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
            argument.InputsMainMemory        = (from i in layer.Inputs
                                                let a = context.MainMemoryMap[i.Connection.From]
                                                        select new MemoryRange
            {
                Start = a.GetAddress(),
                Size = a.Size
            }).ToList();
        }
Exemple #6
0
        public void Infer(K210Conv2d layer, K210Conv2dLayerArgument argument, InferenceContext context)
        {
            var inputAlloc = context.KPUMemoryMap[layer.Input.Connection.From];
            MemoryAllocation outputAlloc;

            argument.Config.InputAddress = inputAlloc.GetAddress();

            if (context.MainMemoryMap.TryGetValue(layer.Output, out var mainAlloc))
            {
                argument.Flags = K210LayerFlags.MainMemoryOutput;
                argument.MainMemoryOutputAddress = mainAlloc.GetAddress();
                outputAlloc = context.GetOrAllocateKPUMemory(layer.Output);
            }
            else
            {
                argument.Flags = K210LayerFlags.None;
                outputAlloc    = context.KPUMemoryMap[layer.Output];
            }

            argument.Config.OutputAddress = outputAlloc.GetAddress();
        }
Exemple #7
0
 public void AllocateInputMemory(Reshape layer, OutputConnector input, InferenceContext context)
 {
     context.MainMemoryMap.Add(layer.Output, context.GetOrAllocateMainMemory(layer.Input.Connection.From));
 }
Exemple #8
0
        public void Infer(ResizeNearestNeighbor layer, ResizeNearestNeighborLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.MainMemoryInputAddress  = inputAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #9
0
        public void Infer(TensorflowFlatten layer, TensorflowFlattenLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.MainMemoryOutput;
            argument.MainMemoryInputAddress  = inputAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }
Exemple #10
0
        public static K210BinGenerationContext GenerateBin(Graph graph, Stream stream, int weightsBits, string prefix, InferenceContext inferenceContext)
        {
            var context = new K210BinGenerationContext
            {
                Prefix          = prefix,
                MaxStartAddress = inferenceContext.KPUMemoryAllocator.MaxStart,
                MainMemoryUsage = inferenceContext.MainMemoryAllocator.MaxEnd,
                Outputs         = (from o in graph.Outputs
                                   let m = inferenceContext.MainMemoryMap[o.Input.Connection.From]
                                           select new K210OutputAddress
                {
                    Address = m.GetAddress(),
                    Size = (uint)o.Input.Dimensions.GetSize() * 4
                }).ToList(),
                Stream      = stream,
                WeightsBits = weightsBits
            };

            var converters = (from t in typeof(Generator).Assembly.ExportedTypes
                              let attrs = t.GetCustomAttributes <LayerConverterAttribute>()
                                          where attrs.Any()
                                          from attr in attrs
                                          where attr.LayerType != K210LayerType.Invalid
                                          select new
            {
                Key = attr.LayerType,
                Value = new { Type = t, Method = t.GetMethod("GenerateBin") }
            }).ToDictionary(x => x.Key, x => x.Value);

            var layers = inferenceContext.InferenceOrders;
            var bw     = new BinaryWriter(stream);

            void GenerateBinLayerBody(K210Layer layer)
            {
                var type = layer.Header.Type;

                if (converters.TryGetValue(type, out var info))
                {
                    if (info.Method != null)
                    {
                        var converter = Activator.CreateInstance(info.Type);
                        info.Method.Invoke(converter, new object[] { bw, layer.Body, context });
                    }
                    else
                    {
                        GenerateBinDefault(bw, layer.Body);
                    }
                }
                else
                {
                    throw new LayerNotSupportedException(type.ToString());
                }

                context.AlignStreamPosition(8);
            }

            uint version = 3;
            uint flags   = weightsBits == 8 ? 1u : 0u;

            bw.Write(version);
            bw.Write(flags);
            bw.Write(0);
            bw.Write(layers.Count);
            bw.Write(context.MaxStartAddress);
            bw.Write(context.MainMemoryUsage);

            // Outputs
            bw.Write(context.Outputs.Count);
            foreach (var output in context.Outputs)
            {
                bw.Write(output.Address);
                bw.Write(output.Size);
            }

            // Headers
            var fixPosition = bw.BaseStream.Position;

            bw.BaseStream.Position += 4 * 2 * layers.Count;

            for (int i = 0; i < layers.Count; i++)
            {
                var layer = layers[i];
                // BodySize
                var beginPosition = bw.BaseStream.Position;
                GenerateBinLayerBody(layer);
                layer.Header.BodySize = (uint)(bw.BaseStream.Position - beginPosition);
            }

            var newPosition = bw.BaseStream.Position;

            bw.BaseStream.Position = fixPosition;
            for (int i = 0; i < layers.Count; i++)
            {
                var header = layers[i].Header;
                bw.Write((uint)header.Type);
                bw.Write((uint)header.BodySize);
            }

            bw.BaseStream.Position = newPosition;
            return(context);
        }
Exemple #11
0
        public void Infer(K210AddPadding layer, K210AddPaddingLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.KPUMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.None;
            argument.MainMemoryInputAddress = inputAlloc.GetAddress();
            argument.KPUMemoryOutputAddress = outputAlloc.GetAddress();
        }
        public void AllocateInputMemory(QuantizedExclusiveConcatenation layer, OutputConnector input, InferenceContext context)
        {
            var  totalAlloc = context.GetOrAllocateMainMemory(layer.Output);
            uint offset     = 0;

            foreach (var node in layer.Inputs.Select(x => x.Connection.From))
            {
                if (context.MainMemoryMap.ContainsKey(node))
                {
                    return;
                }
                uint size = (uint)node.Dimensions.GetSize();
                context.MainMemoryMap.Add(node, new MemoryAllocation(totalAlloc.Node, offset, size));
                offset += size;
            }
        }
Exemple #13
0
        public void Infer(ChannelwiseDequantize layer, ChannelwiseDequantizeLayerArgument argument, InferenceContext context)
        {
            var inputAlloc  = context.MainMemoryMap[layer.Input.Connection.From];
            var outputAlloc = context.MainMemoryMap[layer.Output];

            argument.Flags = K210LayerFlags.MainMemoryOutput;
            argument.MainMemoryInputAddress  = inputAlloc.GetAddress();
            argument.MainMemoryOutputAddress = outputAlloc.GetAddress();
        }