[CoreML][fbcode] Add the `preprocess` python APIs (#64521)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/64521
Add the preprocess part for the coreml delegate. Check out the `example.py` for the usage.
ghstack-source-id: 138324214
Test Plan:
```
(base) [taox@devvm2780.vll0 ~/fbsource/fbcode/caffe2/fb] buck run coreml:example -- --model="/home/taox/mobilenetv2/mobilenetv2.pt" --out="/home/taox/mobilenetv2/mobilenetv2_coreml.pt"
Parsing buck files: finished in 0.5 sec
Downloaded 0/1 artifacts, 0.00 bytes, 100.0% cache miss (for updated rules)
Building: finished in 10.6 sec (100%) 12611/57623 jobs, 1/57623 updated
Total time: 11.1 sec
Converting Frontend ==> MIL Ops: 100%|██████████████████████████████████████████▉| 382/383 [00:00<00:00, 692.58 ops/s]
Running MIL optimization passes: 100%|███████████████████████████████████████████| 18/18 [00:00<00:00, 45.55 passes/s]
Translating MIL ==> MLModel Ops: 100%|███████████████████████████████████████████| 704/704 [00:01<00:00, 468.56 ops/s]
input {
name: "input_0"
type {
multiArrayType {
shape: 1
shape: 3
shape: 224
shape: 224
dataType: FLOAT32
}
}
}
output {
name: "645"
type {
multiArrayType {
dataType: FLOAT32
}
}
}
metadata {
userDefined {
key: "com.github.apple.coremltools.source"
value: "torch==1.10.0a0+fb"
}
userDefined {
key: "com.github.apple.coremltools.version"
value: "4.1"
}
}
{'inputs': '[["input_0", "0", "[1, 3, 224, 224]"]]', 'outputs': '[["645", "0", "[1, 1000]"]]', 'config': '{"spec_ver": "4", "backend": "cpu", "allow_low_precision": "True"}', 'metadata': '{"coremltool_ver": "4.1", "torch_ver": "torch==1.10.0a0+fb"}'}
WARNING: Logging before InitGoogleLogging() is written to STDERR
W0826 13:27:12.690302 2477051 backend_detail.cpp:376] Warning: Backend [coreml] is not available. Execution of this Module is still possible by saving and loading on a device where the backend is available. (function codegen_backend_module)
graph(%self.1 : torch.jit.LoweredModule.coreml.__torch__.torchvision.models.mobilenetv2.MobileNetV2,
%x.1 : Tensor):
%51 : str = prim::Constant[value="Exception: Backend is not available."]()
%50 : str = prim::Constant[value="AssertionError: "]()
%14 : str = prim::Constant[value="forward"]() # <string>:5:62
%48 : Tensor = prim::Uninitialized()
%44 : Tensor = prim::Uninitialized()
%typed_inputs.1 : Any[] = prim::ListConstruct(%x.1)
%__backend.3 : __torch__.torch.classes.__backends__.coreml = prim::GetAttr[name="__backend"](%self.1)
%8 : bool = prim::CallMethod[name="is_available"](%__backend.3) # <string>:4:19
%49 : Tensor = prim::If(%8) # <string>:4:16
block0():
%__backend : __torch__.torch.classes.__backends__.coreml = prim::GetAttr[name="__backend"](%self.1)
%__handles : Dict(str, Any) = prim::GetAttr[name="__handles"](%self.1)
%15 : Any = aten::__getitem__(%__handles, %14) # <string>:5:47
%17 : Any[] = prim::CallMethod[name="execute"](%__backend, %15, %typed_inputs.1) # <string>:5:24
%18 : Any = prim::ListUnpack(%17)
%20 : bool = prim::isinstance[types=[Tensor]](%18)
%39 : Tensor = prim::If(%20) # <string>:6:18
block0():
%22 : Tensor = prim::unchecked_cast(%18)
-> (%22)
block1():
= prim::RaiseException(%50) # <string>:6:18
-> (%44)
-> (%39)
block1():
= prim::RaiseException(%51) # <string>:9:18
-> (%48)
return (%49)
```
Reviewed By: raziel
Differential Revision: D30585154
fbshipit-source-id: 66c7d2e931be6eaa3c43a0ee131ea8046452449d