Upgrade from Sentis 1.6 to Sentis 2
To upgrade from Sentis 1.6 to Sentis 2, do the following:
- Replace uses of
TensorFloat
withTensor<float>
and uses ofTensorInt
withTensor<int>
. - Replace uses of
TensorFloat.AllocZeros(shape)
withnew Tensor<float>(shape)
and uses ofTensorInt.AllocZeros(shape)
withnew Tensor<int>(shape)
. - Replace uses of
TensorFloat.AllocEmpty(shape)
withnew Tensor<float>(shape, null)
and uses ofTensorInt.AllocEmpty(shape)
withnew Tensor<int>(shape, null)
. - Replace uses of
new TensorFloat(float)
withnew Tensor<float>(new TensorShape(), new[] { float })
and uses ofnew TensorInt(int)
withnew Tensor<int>(new TensorShape(), new[] { int })
for scalars. - Replace uses of
tensor.ToReadOnlyArray()
withtensor.DownloadToArray()
. - Replace uses of
SymbolicTensorShape
withDynamicTensorShape
, andSymbolicTensorDim
with integers, where -1 represents an unknown dimension. - Replace uses of
BurstTensorData
withCPUTensorData
. - Replace uses of
IWorker
orGenericWorker
withWorker
. - Replace uses of
WorkerFactory.CreateWorker(backendType, model)
withnew Worker(model, backendType)
. - Replace uses of
worker.Execute
withworker.Schedule
. - Remove uses of
worker.Execute
orworker.SetInputs
with a dictionary, instead use an array or set the inputs one at a time by name. - Replace uses of
worker.ExecuteLayerByLayer
withworker.ScheduleIterable
. - Replace uses of
BackendType.GPUCommandBuffer
withBackendType.GPUCompute
. - Replace uses of
commandBuffer.ExecuteWorker
withcommandBuffer.ScheduleWorker
. - Rewrite uses of
worker.TakeOutputOwnership(...)
usingtensor.ReadbackAndClone(...)
,tensor.ReadbackAndCloneAsync(...)
orworker.CopyOutput(...)
. - Replace uses of the
IBackend
methods with functional graph calls to build models. - Replace uses of
Functional.Compile(Func)
withnew FunctionalGraph()
thengraph.Compile(outputs)
where the outputs are calculated from the inputs and constants. - Replace uses of
InputDefs
withgraph.AddInput<T>(shape)
. - Replace uses of
Functional.Tensor(shape, values)
withFunctional.Constant(shape, values)
.
Upgrade from Sentis 1.5 to Sentis 1.6
To upgrade from Sentis 1.5 to Sentis 1.6, do the following:
- Replace uses of
IBackend.Concat
with calls toIBackend.SliceSet
. - Rewrite calls to
IBackend.Min
andIBackend.Max
to not use tensor arrays as inputs. - Rewrite calls to
IBackend.Sum
andIBackend.Mean
to useIBackend.Add
andIBackend.ScalarMad
instead. - Remove
keepdim
argument from calls to backend reduction methods such asIBackend.ReduceMin
. - Replace strings with ints for tensor indexing internal to models, e.g. when referencing
Output.index
. - Replace uses of
CompleteOperationsAndDownload
withReadbackAndClone
, this will create a new tensor object which you are responsible for disposing. - Rewrite any code that assumes that a zero-length tensor will have a null
Tensor.dataOnBackend
.
Upgrade from Sentis 1.3 or Sentis 1.4 to Sentis 1.5
To upgrade from Sentis 1.3 or Sentis 1.4 to Sentis 1.5, do the following:
- Reimport models that were previously imported in an earlier version of Sentis.
- Reexport serialized .sentis files and encrypted serialized models using Sentis 1.4.
- Replace uses of
IWorker.FinishExecutionAndDownloadOutput
withIWorker.TakeOutputOwnership
. - Replace uses of
Tensor.TakeOwnership
withTensor.CompleteOperationsAndDownload
. - Replace uses of
Tensor.tensorOnDevice
withTensor.dataOnBackend
. - Replace uses of
Tensor.Zeros
withTensor.AllocZeros
. - Replace uses of the
Tensor.shape
setter withTensor.Reshape
. - Remove uses of
Tensor.ShallowReshape
, useTensor.Reshape
to reshape a tensor in place orTensor.AllocNoData
andIBackend.Reshape
to create a new reshaped tensor. - Remove uses of
Tensor.DeepCopy
, useTensor.AllocNoData
andIBackend.MemCopy
to copy a tensor. - Remove uses of the
Model
API, use the functional API to edit models:- Remove
Model.AddInput
, useInputDef
for inputs in aFunctional.Compile
call. - Remove
Model.AddConstant
, useFunctional.Tensor
in aFunctional.Compile
call. - Remove
Model.AddLayer
andLayer
constructors, useFunctional
methods in aFunctional.Compile
call.
- Remove
- Edit
Model.AddOuput
parameters to include both the output name and output index (from the inspector). - When calling
Model.outputs
, useModel.Output.name
to get the name of the output. - Replace uses of
Layer.name
andConstant.name
withLayer.index
andConstant.index
. - Remove uses of the
Ops
API, use the functional API to build models to operate on tensors, or useIBackend
to operate on allocated tensors. - Replace uses of
ArrayTensorData
andSharedArrayTensorData
withCPUTensorData
. - Remove
CustomLayer
custom ONNX layer importers as these are not compatible with Sentis 1.4 serialization. These will be reimplemented in an upcoming release. - Replace uses of
IBackend.deviceType
withIBackend.backendType
to get the backend type. - Remove allocation of tensors using
IBackend
methods, either allocate tensors withTensor
orIModelStorage
. - Remove offset from constructors of
CPUTensorData
, if the offset needs to be greater than zero use aNativeTensorArrayFromManagedArray
in theCPUTensorData
constructor. - Replace uses of
IWorker.StartManualSchedule
withIWorker.ExecuteLayerByLayer
. - Replace uses of
ITensorData.shape
withTensor.shape
. - Remove uses of
ITensorData.AsyncReadbackRequest
andITensorData.IsAsyncReadbackRequestDone
, useTensor.ReadbackRequest
,Tensor.ReadbackRequestAsync
, andTensor.IsReadbackRequestDone
for async readback of tensor data. - Remove uses of
Model.Metadata
, this is not compatible with Sentis 1.4 serialization. - Remove references to
Model.Warnings
, these are not compatible with Sentis 1.4 serialization, use the console to view importer errors and warnings. - Remove uses of
Model.CreateWorker
, useWorkerFactory.CreateWorker
to create a worker. - Remove uses of
Model.ShallowCopy
, use the functional API to copy a model. - Replace constructors of
SymbolicTensorDim
withSymbolicTensorDim.Int
,SymbolicTensorDim.Param
andSymbolicTensorDim.Unknown
static methods.
Upgrade from Sentis 1.1 or 1.2 to Sentis 1.3
To upgrade from Sentis 1.1 or 1.2 to Sentis 1.3, do the following:
- Reimport models that were previously imported in an earlier version of Sentis.
Upgrade from Sentis 1.0 to Sentis 1.1
To upgrade from Sentis 1.0 to Sentis 1.1, do the following:
- Use
MakeReadable
on GPU output tensor before indexing (seeUse tensor indexing methods
sample). - Remove
prepareCacheForAccess
parameter when callingPeekOutput
and instead useMakeReadable
on the returned tensor before reading it. - Use AsyncReadbackRequest for async readbacks from GPU (see
Read output asynchronously
sample). - Replace
: Layer
with: CustomLayer
for custom layers and implementInferOutputDataTypes
method (seeAdd a custom layer
sample). - Replace instances of
IOps
withOps
. - Replace
uploadCache
withclearOnInit
when using .Pin method. - Replace uses of
CopyOutput
withFinishExecutionAndDownloadOutput
.
Upgrade from Barracuda 3.0 to Sentis 1.0
To upgrade from Barracuda 3.0 to Sentis 1.0, do the following:
- Replace references to
Barracuda
withSentis
. - Update tensor operations in your project.
- Use
Tensor<float>
orTensor<int>
for input and output tensors. - Update methods that convert between tensors and textures.
- Convert the model asset type.
- Convert backend types.
- Update getting output from intermediate layers.
- Replace
asFloats
andasInts
.
Replace references to Barracuda with Sentis
All namespaces now use Sentis
instead of Barracuda
. To upgrade your project, change all references to Barracuda
. For example, change using Unity.Barracuda
to using Unity.Sentis
.
Update tensor operations in your project
The way tensors work has changed. Sentis no longer converts tensors to different layouts automatically, so you might need to update your code to make sure input and output tensors are the layout you expect. Refer to Tensor fundamentals for more information.
Use Tensor or Tensor to create tensors
Sentis supports tensors that contain floats or ints.
If you use the new Tensor()
constructor in your code, you must replace it with either new Tensor<float>()
or new Tensor<int>()
.
You can no longer pass dimension sizes to the constructor directly. Instead, you can use the TensorShape
constructor to create a tensor shape, then pass the TensorShape
to the Tensor<float>
or Tensor<int>
constructor.
The following example creates a 1D tensor of length 4:
Tensor<float> inputTensor = new Tensor<float>(new TensorShape(4), new[] { 2.0f, 1.0f, 3.0f, 0.0f });
Refer to Create input for a model for more information.
Update methods that convert between tensors and textures
You can no longer pass a texture as a parameter to a Tensor
constructor directly. Use the TextureConverter.ToTensor
API instead. Refer to Convert a tensor to a texture for more information.
For example:
Tensor<float> inputTensor = TextureConvert.ToTensor(inputTexture);
Refer to Use output data for more information.
Convert the model asset type
The NNModel
object is now called ModelAsset
. Update your code with the new name.
For example, when you create a runtime model:
using UnityEngine;
using Unity.Sentis;
public class CreateRuntimeModel : MonoBehaviour
{
ModelAsset modelAsset;
void Start()
{
Model runtimeModel = ModelLoader.Load(modelAsset);
}
}
Refer to Import a model for more information.
Convert backend types
Update your code to reflect the following changes to backend type names:
- Use
BackendType.GPUCompute
instead ofWorkerFactory.Type.Compute
,WorkerFactory.Type.ComputeRef
orWorkerFactory.Type.ComputeRefPrecompiled
. - Use
BackendType.CPU
instead ofWorkerFactory.Type.CSharpBurst
,WorkerFactory.Type.CSharpRef
orWorkerFactory.Type.CSharp
.
For example, use the following to create a worker that runs on the GPU with Sentis compute shaders:
IWorker worker = new Worker(runtimeModel, BackendType.GPUCompute);
Update getting output from intermediate layers
To get output from layers other than the output layers from the model, you now need to use AddOutput
before you create the worker and use PeekOutput
.
For example:
// Add the layer to the model outputs in the runtime model
runtimeModel.AddOutput("ConvolutionLayer");
// Create a worker
worker = new Worker(runtimeModel, BackendType.GPUCompute);
// Run the model with the input data
worker.Schedule(inputTensor);
// Get the output from the model
Tensor<float> outputTensor = worker.PeekOutput() as Tensor<float>;
// Get the output from the ConvolutionLayer layer
Tensor<float> convolutionLayerOutputTensor = worker.PeekOutput("ConvolutionLayer") as Tensor<float>;
You should only use this for debugging. Refer to Profile a model for more information.
Replace asFloats and asInts
The Tensor
classes no longer contain the asFloats
and asInts
methods. Use ToReadOnlyArray
instead.