Я обучил модель семантической сегментации SageMaker, используя встроенный алгоритм семантической сегментации sagemaker. Это нормально развертывается на конечной точке SageMaker, и я могу успешно выполнить вывод в облаке из нее. Я хотел бы использовать модель на периферийном устройстве (AWS Panorama Appliance), что должно означать просто компиляцию модели с помощью SageMaker Neo в соответствии со спецификациями целевого устройства.
Однако, независимо от того, какое у меня целевое устройство (настройки Neo), я не могу скомпилировать модель с Neo, поскольку получаю следующую ошибку:
ClientError: InputConfiguration: No valid Mxnet model file -symbol.json found
Файл model.tar.gz для моделей семантической сегментации содержит hyperparams.json, model_algo-1, model_best.params. Согласно документам, model_algo-1 — это сериализованная модель mxnet. Разве Neo не поддерживает глюонные модели?
Между прочим, я столкнулся с точно такой же проблемой с другим встроенным алгоритмом SageMaker, k-Nearest Neighbor (k-NN). Кажется, он тоже скомпилирован без -symbol.json.
Есть ли какие-нибудь сценарии, которые я могу запустить, чтобы воссоздать файл -symbol.json или преобразовать скомпилированную модель sagemaker?
После построения моей модели с помощью Estimator я скомпилировал ее в SageMaker Neo с кодом:
optimized_ic = my_estimator.compile_model(
target_instance_family = "ml_c5",
target_platform_os = "LINUX",
target_platform_arch = "ARM64",
input_shape = {"data": [1,3,512,512]},
output_path=s3_optimized_output_location,
framework = "mxnet",
framework_version = "1.8",
)
Я бы ожидал, что это скомпилируется нормально, но именно здесь я получаю сообщение об ошибке, говорящее о том, что в модели отсутствует файл *-symbol.json.
По какой-то причине AWS решила не делать свои встроенные алгоритмы напрямую совместимыми с Neo... Однако вы можете перепроектировать сетевые параметры, используя выходной файл model.tar.gz, а затем скомпилировать.
Шаг 1: Извлеките модель из tar-файла
import tarfile
#path to local tar file
model = 'ss_model.tar.gz'
#extract tar file
t = tarfile.open(model, 'r:gz')
t.extractall()
Это должно вывести два файла: model_algo-1, model_best.params
В этом случае я использовал DeepLabv3 с resnet50.
import gluoncv
import mxnet as mx
from gluoncv import model_zoo
from gluoncv.data.transforms.presets.segmentation import test_transform
model = model_zoo.DeepLabV3(nclass=2, backbone='resnet50', pretrained_base=False, height=800, width=1280, crop_size=240)
model.load_parameters("model_algo-1")
Используйте изображение, которое использовалось для обучения.
#use cpu
ctx = mx.cpu(0)
#decode image bytes of loaded file
img = image.imdecode(imbytes)
#transform image
img = test_transform(img, ctx)
img = img.astype('float32')
print('tranformed image shape: ', img.shape)
#get prediction
output = model.predict(img)
Дополнительная проверка на совместимость формы изображения
model.hybridize()
model(mx.nd.ones((1,3,800,1280)))
export_block('deeplabv3-res50', model, data_shape=(3,800,1280), preprocess=None, layout='CHW')
Он содержит параметры и файл json, которые ищет Нео.
tar = tarfile.open("comp_model.tar.gz", "w:gz")
for name in ["deeplabv3-res50-0000.params", "deeplabv3-res50-symbol.json"]:
tar.add(name)
tar.close()
Чемпион! Это сработало. Я также делал несколько глупостей, но в конце концов придумал, как заставить его работать с вашим кодом. Для начала при компиляции алгоритма SS в SageMaker укажите алгоритм в гиперпараметре "algorithm" на "deeplab" иначе он будет компилироваться совсем по другой модели и не будет соответствовать размеру при "load_parameters". Также «img = image.imdecode(imbytes)» относится к mx.image (не cv2...), который по умолчанию использовал неправильную библиотеку. Предлагаю добавить импорт в топ для...
from gluoncv import utils
. Спасибо за помощь. удивительно!