Skip to content

ai.setTensor with tensor of doubles throws casting exception #54

Open
@bsbodden

Description

@bsbodden

In this branch https://github.com/redis-developer/redisai-iris/pull/1 I have an updated example of creating a SciKit model, train it, and converting it into a Pytorch's TorchScript model using MS Hummingbird.ml.

Here's an example of the converted Torch model working in RedisAI via the CLI:

$ redis-cli -x AI.MODELSTORE iris TORCH CPU BLOB < iris.pt
AI.TENSORSET iris:in FLOAT 2 4 VALUES 5.0 3.4 1.6 0.4 6.0 2.2 5.0 1.5
AI.MODELEXECUTE iris INPUTS 1 iris:in OUTPUTS 2 iris:inferences iris:scores

AI.TENSORGET iris:inferences VALUES
    1) (integer) 0
    2) (integer) 2

AI.TENSORGET iris:scores VALUES
    1) "0.96567678451538086"
    2) "0.034322910010814667"
    3) "3.4662525649764575e-07"
    4) "0.00066925224382430315"
    5) "0.45369619131088257"
    6) "0.54563456773757935"

In JRedisAI I am trying the following:

 @Test
  public void testTorchScriptModelRun() {
    // $ redis-cli -x AI.MODELSTORE iris TORCH CPU BLOB < iris.pt
    AIOperations<String> ai = modulesOperations.opsForAI();
    
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("ai/iris.pt").getFile());
    String modelPath = file.getAbsolutePath();
    
    ai.setModel("iris-torch", Backend.TORCH, Device.CPU, new String[] {"iris:in"}, new String[] {"iris:inferences", "iris:scores"}, modelPath);
    
    // AI.TENSORSET iris:in FLOAT 2 4 VALUES 5.0 3.4 1.6 0.4 6.0 2.2 5.0 1.5
    ai.setTensor("iris:in", new double[] {5.0, 3.4, 1.6, 0.4, 6.0, 2.2, 5.0, 1.5}, new int[]{2, 4});
    
    // AI.MODELEXECUTE iris INPUTS 1 iris:in OUTPUTS 2 iris:inferences iris:scores
    Assert.assertTrue(ai.runModel("iris-torch", new String[] {"iris:in"}, new String[] {"iris:inferences", "iris:scores"}));
    
    //    Check the predictions:
    Tensor inferences = ai.getTensor("iris:inferences");
    float[] values = (float[]) inferences.getValues();
    float[] expected = new float[] {0, 2};
    
    Assert.assertEquals("Assert same shape of values", 2, values.length);
    Assert.assertArrayEquals(expected, values, (float) 0.1);
  }

I get the following ClassCastException from the ai.setTensor("iris:in", new double[] {5.0, 3.4, 1.6, 0.4, 6.0, 2.2, 5.0, 1.5}, new int[]{2, 4}); line:

java.lang.ClassCastException: class java.lang.Double cannot be cast to class [D (java.lang.Double and [D are in module java.base of loader 'bootstrap')
	at com.redislabs.redisai.DataType$4.toByteArray(DataType.java:75)
	at com.redislabs.redisai.DataType.toByteArray(DataType.java:151)
	at com.redislabs.redisai.DataType.toByteArray(DataType.java:148)
	at com.redislabs.redisai.DataType.toByteArray(DataType.java:165)
	at com.redislabs.redisai.Tensor.tensorSetFlatArgs(Tensor.java:111)
	at com.redislabs.redisai.RedisAI.setTensor(RedisAI.java:126)
	at com.redislabs.redisai.RedisAI.setTensor(RedisAI.java:114)
	at com.redislabs.spring.ai.AIOperationsImpl.setTensor(AIOperationsImpl.java:24)
	at com.redislabs.spring.OpsForAITest.testTorchScriptModelRun(OpsForAITest.java:57)
...

Any hints on how to write this particular input Tensor would be appreciated. Thanks!

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions