aws-cdk-neuronx-patterns 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,7 +48,7 @@ const isComplete = async (event) => {
48
48
  return {
49
49
  IsComplete: true,
50
50
  Data: {
51
- ArtifactS3Url: event.ResourceProperties.artifactS3Url,
51
+ ArtifactS3Prefix: event.ResourceProperties.artifactS3Prefix,
52
52
  },
53
53
  };
54
54
  case "FAILED":
@@ -59,4 +59,4 @@ const isComplete = async (event) => {
59
59
  };
60
60
  };
61
61
  exports.isComplete = isComplete;
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJpdmF0ZS9hd2FpdC1jb21waWxlLWpvYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBNkQ7QUFDN0Qsd0RBSStCO0FBTS9CLE1BQU0sTUFBTSxHQUFHLElBQUksMEJBQVcsQ0FBQztJQUM3QixNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7Q0FDdkMsQ0FBQyxDQUFDO0FBQ0ksTUFBTSxPQUFPLEdBQTZCLEtBQUssRUFDcEQsS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsRUFBRTtJQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFFBQVE7WUFDWCxPQUFPLElBQUEsZ0JBQVEsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBRSxDQUFDO1FBQy9DLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQztBQWJXLFFBQUEsT0FBTyxXQWFsQjtBQUNLLE1BQU0sUUFBUSxHQUE2QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FDM0IsSUFBSSwrQkFBZ0IsQ0FBQztRQUNuQixPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDaEksYUFBYSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0I7UUFDeEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXO0tBQy9DLENBQUMsQ0FDSCxDQUFDO0lBQ0YsT0FBTztRQUNMLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztLQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBYlcsUUFBQSxRQUFRLFlBYW5CO0FBRUssTUFBTSxVQUFVLEdBQXVDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUM1RSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUM1QixJQUFJLGtDQUFtQixDQUFDO1FBQ3RCLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7S0FDcEIsQ0FBQyxDQUNILENBQUM7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixLQUFLLFdBQVc7WUFDZCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixJQUFJLEVBQUU7b0JBQ0osYUFBYSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhO2lCQUN0RDthQUNGLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTztRQUNMLFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUM7QUFDSixDQUFDLENBQUM7QUE3QlcsUUFBQSxVQUFVLGNBNkJyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIEJhdGNoQ2xpZW50LFxuICBEZXNjcmliZUpvYnNDb21tYW5kLFxuICBTdWJtaXRKb2JDb21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWJhdGNoXCI7XG5pbXBvcnQge1xuICB0eXBlIENka0N1c3RvbVJlc291cmNlSGFuZGxlcixcbiAgdHlwZSBDZGtDdXN0b21SZXNvdXJjZUlzQ29tcGxldGVIYW5kbGVyLFxufSBmcm9tIFwiYXdzLWxhbWJkYVwiO1xuXG5jb25zdCBjbGllbnQgPSBuZXcgQmF0Y2hDbGllbnQoe1xuICByZWdpb246IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTixcbn0pO1xuZXhwb3J0IGNvbnN0IG9uRXZlbnQ6IENka0N1c3RvbVJlc291cmNlSGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQsXG4gIF9jb250ZXh0LFxuICBfY2FsbGJhY2ssXG4pID0+IHtcbiAgY29uc29sZS5sb2coZXZlbnQpO1xuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSBcIkNyZWF0ZVwiOlxuICAgIGNhc2UgXCJVcGRhdGVcIjpcbiAgICAgIHJldHVybiBvbkNyZWF0ZShldmVudCwgX2NvbnRleHQsIF9jYWxsYmFjaykhO1xuICAgIGNhc2UgXCJEZWxldGVcIjpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBvbkNyZWF0ZTogQ2RrQ3VzdG9tUmVzb3VyY2VIYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgam9iID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgbmV3IFN1Ym1pdEpvYkNvbW1hbmQoe1xuICAgICAgam9iTmFtZTogYCR7bm93LmdldEZ1bGxZZWFyKCl9LSR7bm93LmdldE1vbnRoKCkgKyAxfS0ke25vdy5nZXREYXRlKCl9LSR7bm93LmdldEhvdXJzKCl9LSR7bm93LmdldE1pbnV0ZXMoKX0tJHtub3cuZ2V0U2Vjb25kcygpfWAsXG4gICAgICBqb2JEZWZpbml0aW9uOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuam9iRGVmaW5pdGlvbkFybixcbiAgICAgIGpvYlF1ZXVlOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuam9iUXVldWVBcm4sXG4gICAgfSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgam9iSWQ6IGpvYi5qb2JJZCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NvbXBsZXRlOiBDZGtDdXN0b21SZXNvdXJjZUlzQ29tcGxldGVIYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXCJEZWxldGVcIikge1xuICAgIHJldHVybiB7XG4gICAgICBJc0NvbXBsZXRlOiB0cnVlLFxuICAgIH07XG4gIH1cbiAgY29uc3Qgam9icyA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgIG5ldyBEZXNjcmliZUpvYnNDb21tYW5kKHtcbiAgICAgIGpvYnM6IFtldmVudC5qb2JJZF0sXG4gICAgfSksXG4gICk7XG4gIGNvbnN0IGpvYiA9IGpvYnMuam9icz8uWzBdO1xuICBpZiAoIWpvYikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSm9iICgke2V2ZW50LmpvYklkfSkgaXMgbWlzc2luZ2ApO1xuICB9XG4gIHN3aXRjaCAoam9iLnN0YXR1cykge1xuICAgIGNhc2UgXCJTVUNDRUVERURcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIElzQ29tcGxldGU6IHRydWUsXG4gICAgICAgIERhdGE6IHtcbiAgICAgICAgICBBcnRpZmFjdFMzVXJsOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuYXJ0aWZhY3RTM1VybCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgY2FzZSBcIkZBSUxFRFwiOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGpvYi5zdGF0dXNSZWFzb24pO1xuICB9XG4gIHJldHVybiB7XG4gICAgSXNDb21wbGV0ZTogZmFsc2UsXG4gIH07XG59O1xuIl19
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJpdmF0ZS9hd2FpdC1jb21waWxlLWpvYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBNkQ7QUFDN0Qsd0RBSStCO0FBTS9CLE1BQU0sTUFBTSxHQUFHLElBQUksMEJBQVcsQ0FBQztJQUM3QixNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7Q0FDdkMsQ0FBQyxDQUFDO0FBQ0ksTUFBTSxPQUFPLEdBQTZCLEtBQUssRUFDcEQsS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsRUFBRTtJQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFFBQVE7WUFDWCxPQUFPLElBQUEsZ0JBQVEsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBRSxDQUFDO1FBQy9DLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQztBQWJXLFFBQUEsT0FBTyxXQWFsQjtBQUNLLE1BQU0sUUFBUSxHQUE2QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FDM0IsSUFBSSwrQkFBZ0IsQ0FBQztRQUNuQixPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDaEksYUFBYSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0I7UUFDeEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXO0tBQy9DLENBQUMsQ0FDSCxDQUFDO0lBQ0YsT0FBTztRQUNMLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztLQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBYlcsUUFBQSxRQUFRLFlBYW5CO0FBRUssTUFBTSxVQUFVLEdBQXVDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUM1RSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUM1QixJQUFJLGtDQUFtQixDQUFDO1FBQ3RCLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7S0FDcEIsQ0FBQyxDQUNILENBQUM7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixLQUFLLFdBQVc7WUFDZCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixJQUFJLEVBQUU7b0JBQ0osZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQjtpQkFDNUQ7YUFDRixDQUFDO1FBQ0osS0FBSyxRQUFRO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBN0JXLFFBQUEsVUFBVSxjQTZCckIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQge1xuICBCYXRjaENsaWVudCxcbiAgRGVzY3JpYmVKb2JzQ29tbWFuZCxcbiAgU3VibWl0Sm9iQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1iYXRjaFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDZGtDdXN0b21SZXNvdXJjZUhhbmRsZXIsXG4gIHR5cGUgQ2RrQ3VzdG9tUmVzb3VyY2VJc0NvbXBsZXRlSGFuZGxlcixcbn0gZnJvbSBcImF3cy1sYW1iZGFcIjtcblxuY29uc3QgY2xpZW50ID0gbmV3IEJhdGNoQ2xpZW50KHtcbiAgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04sXG59KTtcbmV4cG9ydCBjb25zdCBvbkV2ZW50OiBDZGtDdXN0b21SZXNvdXJjZUhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50LFxuICBfY29udGV4dCxcbiAgX2NhbGxiYWNrLFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgIGNhc2UgXCJDcmVhdGVcIjpcbiAgICBjYXNlIFwiVXBkYXRlXCI6XG4gICAgICByZXR1cm4gb25DcmVhdGUoZXZlbnQsIF9jb250ZXh0LCBfY2FsbGJhY2spITtcbiAgICBjYXNlIFwiRGVsZXRlXCI6XG4gICAgICByZXR1cm4ge307XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgb25DcmVhdGU6IENka0N1c3RvbVJlc291cmNlSGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zb2xlLmxvZyhldmVudCk7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGpvYiA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgIG5ldyBTdWJtaXRKb2JDb21tYW5kKHtcbiAgICAgIGpvYk5hbWU6IGAke25vdy5nZXRGdWxsWWVhcigpfS0ke25vdy5nZXRNb250aCgpICsgMX0tJHtub3cuZ2V0RGF0ZSgpfS0ke25vdy5nZXRIb3VycygpfS0ke25vdy5nZXRNaW51dGVzKCl9LSR7bm93LmdldFNlY29uZHMoKX1gLFxuICAgICAgam9iRGVmaW5pdGlvbjogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLmpvYkRlZmluaXRpb25Bcm4sXG4gICAgICBqb2JRdWV1ZTogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLmpvYlF1ZXVlQXJuLFxuICAgIH0pLFxuICApO1xuICByZXR1cm4ge1xuICAgIGpvYklkOiBqb2Iuam9iSWQsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNDb21wbGV0ZTogQ2RrQ3VzdG9tUmVzb3VyY2VJc0NvbXBsZXRlSGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge1xuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSXNDb21wbGV0ZTogdHJ1ZSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGpvYnMgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICBuZXcgRGVzY3JpYmVKb2JzQ29tbWFuZCh7XG4gICAgICBqb2JzOiBbZXZlbnQuam9iSWRdLFxuICAgIH0pLFxuICApO1xuICBjb25zdCBqb2IgPSBqb2JzLmpvYnM/LlswXTtcbiAgaWYgKCFqb2IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEpvYiAoJHtldmVudC5qb2JJZH0pIGlzIG1pc3NpbmdgKTtcbiAgfVxuICBzd2l0Y2ggKGpvYi5zdGF0dXMpIHtcbiAgICBjYXNlIFwiU1VDQ0VFREVEXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBJc0NvbXBsZXRlOiB0cnVlLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJ0aWZhY3RTM1ByZWZpeDogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLmFydGlmYWN0UzNQcmVmaXgsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIGNhc2UgXCJGQUlMRURcIjpcbiAgICAgIHRocm93IG5ldyBFcnJvcihqb2Iuc3RhdHVzUmVhc29uKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIElzQ29tcGxldGU6IGZhbHNlLFxuICB9O1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { CompileOptions, Parameters } from "../model";
2
+ export declare function calcTpDegree(parameters: Parameters, compileOptions: CompileOptions): number;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calcTpDegree = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const model_1 = require("../model");
6
+ function calcTpDegree(parameters, compileOptions) {
7
+ // case of float16
8
+ const bytesPerParamete = 16 / 8;
9
+ // memory = bytes per parameter * number of parameters
10
+ let memory = aws_cdk_lib_1.Size.gibibytes(bytesPerParamete * parameters.toBilion());
11
+ switch (compileOptions.quantDtype) {
12
+ case model_1.QuantDtype.S8:
13
+ memory = aws_cdk_lib_1.Size.gibibytes(Math.floor(memory.toGibibytes() * 0.7));
14
+ break;
15
+ }
16
+ if (compileOptions.nPositions && compileOptions.nPositions < 4096) {
17
+ memory = aws_cdk_lib_1.Size.gibibytes(memory.toGibibytes() -
18
+ Math.floor((compileOptions.nPositions / 4096) * 0.1));
19
+ }
20
+ const neronxCoreMemory = aws_cdk_lib_1.Size.gibibytes(16);
21
+ const minimum = Math.ceil(memory.toGibibytes() / neronxCoreMemory.toGibibytes());
22
+ const tpDegrees = [1, 2, 4, 8, 24];
23
+ for (const tpDegree of tpDegrees) {
24
+ if (minimum <= tpDegree) {
25
+ return tpDegree;
26
+ }
27
+ }
28
+ throw new Error("This model is too large, I can not support this model current version.");
29
+ }
30
+ exports.calcTpDegree = calcTpDegree;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW1DO0FBQ25DLG9DQUFrRTtBQUVsRSxTQUFnQixZQUFZLENBQzFCLFVBQXNCLEVBQ3RCLGNBQThCO0lBRTlCLGtCQUFrQjtJQUNsQixNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsc0RBQXNEO0lBQ3RELElBQUksTUFBTSxHQUFHLGtCQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLFFBQVEsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLEtBQUssa0JBQVUsQ0FBQyxFQUFFO1lBQ2hCLE1BQU0sR0FBRyxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU07SUFDVixDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsVUFBVSxJQUFJLGNBQWMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEUsTUFBTSxHQUFHLGtCQUFJLENBQUMsU0FBUyxDQUNyQixNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sZ0JBQWdCLEdBQUcsa0JBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUN0RCxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN4QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLENBQ3pFLENBQUM7QUFDSixDQUFDO0FBakNELG9DQWlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpemUgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbXBpbGVPcHRpb25zLCBQYXJhbWV0ZXJzLCBRdWFudER0eXBlIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVHBEZWdyZWUoXG4gIHBhcmFtZXRlcnM6IFBhcmFtZXRlcnMsXG4gIGNvbXBpbGVPcHRpb25zOiBDb21waWxlT3B0aW9ucyxcbikge1xuICAvLyBjYXNlIG9mIGZsb2F0MTZcbiAgY29uc3QgYnl0ZXNQZXJQYXJhbWV0ZSA9IDE2IC8gODtcbiAgLy8gbWVtb3J5ID0gYnl0ZXMgcGVyIHBhcmFtZXRlciAqIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gIGxldCBtZW1vcnkgPSBTaXplLmdpYmlieXRlcyhieXRlc1BlclBhcmFtZXRlICogcGFyYW1ldGVycy50b0JpbGlvbigpKTtcbiAgc3dpdGNoIChjb21waWxlT3B0aW9ucy5xdWFudER0eXBlKSB7XG4gICAgY2FzZSBRdWFudER0eXBlLlM4OlxuICAgICAgbWVtb3J5ID0gU2l6ZS5naWJpYnl0ZXMoTWF0aC5mbG9vcihtZW1vcnkudG9HaWJpYnl0ZXMoKSAqIDAuNykpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGNvbXBpbGVPcHRpb25zLm5Qb3NpdGlvbnMgJiYgY29tcGlsZU9wdGlvbnMublBvc2l0aW9ucyA8IDQwOTYpIHtcbiAgICBtZW1vcnkgPSBTaXplLmdpYmlieXRlcyhcbiAgICAgIG1lbW9yeS50b0dpYmlieXRlcygpIC1cbiAgICAgICAgTWF0aC5mbG9vcigoY29tcGlsZU9wdGlvbnMublBvc2l0aW9ucyEgLyA0MDk2KSAqIDAuMSksXG4gICAgKTtcbiAgfVxuICBjb25zdCBuZXJvbnhDb3JlTWVtb3J5ID0gU2l6ZS5naWJpYnl0ZXMoMTYpO1xuICBjb25zdCBtaW5pbXVtID0gTWF0aC5jZWlsKFxuICAgIG1lbW9yeS50b0dpYmlieXRlcygpIC8gbmVyb254Q29yZU1lbW9yeS50b0dpYmlieXRlcygpLFxuICApO1xuXG4gIGNvbnN0IHRwRGVncmVlcyA9IFsxLCAyLCA0LCA4LCAyNF07XG4gIGZvciAoY29uc3QgdHBEZWdyZWUgb2YgdHBEZWdyZWVzKSB7XG4gICAgaWYgKG1pbmltdW0gPD0gdHBEZWdyZWUpIHtcbiAgICAgIHJldHVybiB0cERlZ3JlZTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIFwiVGhpcyBtb2RlbCBpcyB0b28gbGFyZ2UsIEkgY2FuIG5vdCBzdXBwb3J0IHRoaXMgbW9kZWwgY3VycmVudCB2ZXJzaW9uLlwiLFxuICApO1xufVxuIl19
@@ -0,0 +1,113 @@
1
+ import * as sagemaker from "@aws-cdk/aws-sagemaker-alpha";
2
+ import { Duration, Size } from "aws-cdk-lib";
3
+ import { Grant, IGrantable } from "aws-cdk-lib/aws-iam";
4
+ import { IBucket } from "aws-cdk-lib/aws-s3";
5
+ import { ISource } from "aws-cdk-lib/aws-s3-deployment";
6
+ import { Construct } from "constructs";
7
+ import { CompileOptions, OptLevel, Parameters, QuantDtype } from "./model";
8
+ import { NeuronxCompile } from "./neuronx-compile";
9
+ import { NeuronxInstanceType } from "./neuronx-instance-type";
10
+ /**
11
+ * Precompiled model options.
12
+ */
13
+ export interface CompiledModelOptions {
14
+ /**
15
+ * Neuronx compile options.
16
+ * @default - Each properties are set default.
17
+ */
18
+ readonly compileOptions?: CompileOptions;
19
+ /**
20
+ * Code used for inference
21
+ * @default - using the predefined code
22
+ */
23
+ readonly code?: ISource;
24
+ /**
25
+ * Model ID or saved path
26
+ * @default "./model"
27
+ */
28
+ readonly modelIdOrPath?: string;
29
+ /**
30
+ * The path where compiled artifacts (i.e. xxx.neff) are stored
31
+ * @default "./compiled"
32
+ */
33
+ readonly compiledArtifactPath?: string;
34
+ }
35
+ export interface BucketCompiledModelOptions extends CompiledModelOptions {
36
+ /**
37
+ * The number of parameters of model.
38
+ */
39
+ readonly parameters: Parameters;
40
+ }
41
+ export declare class TransformersNeuronxSageMakerInferenceModelData {
42
+ static fromBucket(bucket: IBucket, prefix: string, options: BucketCompiledModelOptions): TransformersNeuronxSageMakerInferenceModelData;
43
+ static fromNeuronxCompile(compile: NeuronxCompile, code?: ISource): TransformersNeuronxSageMakerInferenceModelData;
44
+ readonly bucket: IBucket;
45
+ readonly compiledArtifactS3Prefix: string;
46
+ readonly code: ISource;
47
+ readonly tpDegree: number;
48
+ readonly quantDtype?: QuantDtype;
49
+ readonly nPositions: number;
50
+ readonly optLevel: OptLevel;
51
+ readonly modelIdOrPath?: string;
52
+ readonly compiledArtifactPath?: string;
53
+ readonly parameters: Parameters;
54
+ private constructor();
55
+ }
56
+ export interface TransformersNeuronxSageMakerRealtimeInferenceEndpointProps {
57
+ /**
58
+ * Model data for SageMaker inference.
59
+ * The model data requires at least compiled artifacts.
60
+ */
61
+ readonly modelData: TransformersNeuronxSageMakerInferenceModelData;
62
+ /**
63
+ * An image of the container where the inference job is executed.
64
+ */
65
+ readonly image?: sagemaker.ContainerImage;
66
+ /**
67
+ * A map of environment variables to pass into the container.
68
+ * @default - Only the predefined environment variables required to use Neuronx have been set.
69
+ */
70
+ readonly environment?: {
71
+ [key: string]: string;
72
+ };
73
+ /**
74
+ * The instance type of compile worker instance.
75
+ * @default - It is determined automatically according to the number of model parameters and compilation options.
76
+ */
77
+ readonly instanceType?: NeuronxInstanceType;
78
+ /**
79
+ * The size, of the ML storage volume attached to individual inference instance associated with the production variant.
80
+ * Currently only Amazon EBS gp2 storage volumes are supported.
81
+ * @see https://aws.amazon.com/jp/releasenotes/host-instance-storage-volumes-table
82
+ * @default - 2.5 GB per billion parameter (Max 512 GB)
83
+ */
84
+ readonly volumeSize?: Size;
85
+ /**
86
+ * The timeout value, to download and extract the model that you want to host from Amazon S3
87
+ * to the individual inference instance associated with this production variant.
88
+ * @default - 60 seconds, when `volumeSize` larger than 30GB then 1GB x 15 seconds (max 60 minutes)
89
+ */
90
+ readonly modelDataDownloadTimeout?: Duration;
91
+ /**
92
+ * The timeout value, for your inference container to pass health check by SageMaker Hosting.
93
+ * @see https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-inference-code.html#your-algorithms-inference-algo-ping-requests
94
+ * @default - 60 seconds, when set the `modelDataDownloadTimeout` then use same value (max 60 minutes)
95
+ */
96
+ readonly containerStartupHealthCheckTimeout?: Duration;
97
+ }
98
+ export declare class TransformersNeuronxSageMakerRealtimeInferenceEndpoint extends Construct {
99
+ /**
100
+ * The ARN of the endpoint.
101
+ * @attribute
102
+ */
103
+ readonly endpointArn: string;
104
+ /**
105
+ * The name of the endpoint.
106
+ * @attribute
107
+ */
108
+ readonly endpointName: string;
109
+ private readonly endpoint;
110
+ constructor(scope: Construct, id: string, props: TransformersNeuronxSageMakerRealtimeInferenceEndpointProps);
111
+ grantInvoke(grantee: IGrantable): Grant;
112
+ private selectInstanceTypeByTpDegree;
113
+ }
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TransformersNeuronxSageMakerRealtimeInferenceEndpoint = exports.TransformersNeuronxSageMakerInferenceModelData = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const path_1 = require("path");
7
+ const sagemaker = require("@aws-cdk/aws-sagemaker-alpha");
8
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
9
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
10
+ const constructs_1 = require("constructs");
11
+ const model_1 = require("./model");
12
+ const neuronx_instance_type_1 = require("./neuronx-instance-type");
13
+ const util_1 = require("./private/util");
14
+ class TransformersNeuronxSageMakerInferenceModelData {
15
+ static fromBucket(bucket, prefix, options) {
16
+ const nPositions = options.compileOptions?.nPositions ?? 4096;
17
+ const quantDtype = options.compileOptions?.quantDtype;
18
+ const optLevel = options.compileOptions?.optLevel ?? model_1.OptLevel.BEST_BALANCE;
19
+ const tpDegree = options.compileOptions?.tpDegree ??
20
+ (0, util_1.calcTpDegree)(options.parameters, {
21
+ nPositions,
22
+ quantDtype,
23
+ });
24
+ return new TransformersNeuronxSageMakerInferenceModelData({
25
+ bucket,
26
+ compiledArtifactS3Prefix: prefix,
27
+ nPositions,
28
+ quantDtype,
29
+ optLevel,
30
+ tpDegree,
31
+ code: options.code,
32
+ modelIdOrPath: options.modelIdOrPath,
33
+ parameters: options.parameters,
34
+ });
35
+ }
36
+ static fromNeuronxCompile(compile, code) {
37
+ return new TransformersNeuronxSageMakerInferenceModelData({
38
+ ...compile,
39
+ bucket: compile.compiledArtifactS3Bucket,
40
+ compiledArtifactS3Prefix: compile.compiledArtifactS3Prefix,
41
+ code,
42
+ });
43
+ }
44
+ constructor(options) {
45
+ this.bucket = options.bucket;
46
+ this.compiledArtifactS3Prefix = options.compiledArtifactS3Prefix;
47
+ this.code =
48
+ options.code ??
49
+ aws_s3_deployment_1.Source.asset((0, path_1.join)(__dirname, "../scripts/inference/transformers-neuronx/code"));
50
+ this.tpDegree = options.tpDegree;
51
+ this.quantDtype = options.quantDtype;
52
+ this.nPositions = options.nPositions;
53
+ this.optLevel = options.optLevel;
54
+ this.modelIdOrPath = options.modelIdOrPath;
55
+ this.compiledArtifactPath = options.compiledArtifactPath;
56
+ this.parameters = options.parameters;
57
+ }
58
+ }
59
+ exports.TransformersNeuronxSageMakerInferenceModelData = TransformersNeuronxSageMakerInferenceModelData;
60
+ _a = JSII_RTTI_SYMBOL_1;
61
+ TransformersNeuronxSageMakerInferenceModelData[_a] = { fqn: "aws-cdk-neuronx-patterns.TransformersNeuronxSageMakerInferenceModelData", version: "0.0.4" };
62
+ class TransformersNeuronxSageMakerRealtimeInferenceEndpoint extends constructs_1.Construct {
63
+ constructor(scope, id, props) {
64
+ super(scope, id);
65
+ const image = props.image ??
66
+ sagemaker.ContainerImage.fromAsset((0, path_1.join)(__dirname, "../scripts/inference/transformers-neuronx"));
67
+ const instanceType = props.instanceType ??
68
+ this.selectInstanceTypeByTpDegree(props.modelData.tpDegree);
69
+ const deploy = new aws_s3_deployment_1.BucketDeployment(this, "CodeDeployment", {
70
+ destinationBucket: props.modelData.bucket,
71
+ sources: [props.modelData.code],
72
+ destinationKeyPrefix: (0, path_1.join)(props.modelData.compiledArtifactS3Prefix, "code"),
73
+ });
74
+ const model = new sagemaker.Model(this, "Model", {
75
+ containers: [
76
+ {
77
+ image,
78
+ environment: {
79
+ NEURON_RT_NUM_CORES: props.modelData.tpDegree.toString(),
80
+ TS_DEFAULT_RESPONSE_TIMEOUT: (60 * 60).toString(),
81
+ TS_DEFAULT_WORKERS_PER_MODEL: Math.floor(instanceType.acceleratorChips.neuronxCores /
82
+ props.modelData.tpDegree).toString(),
83
+ MODEL: props.modelData.modelIdOrPath ?? "./model",
84
+ COMPILED_ARTIFACT: props.modelData.compiledArtifactPath ?? "./compiled",
85
+ TP_DEGREE: props.modelData.tpDegree.toString(),
86
+ N_POSITIONS: props.modelData.nPositions.toString(),
87
+ OPT_LEVEL: props.modelData.optLevel.toString(),
88
+ QUANT_DTYPE: props.modelData.quantDtype?.toString() ?? "",
89
+ ...props.environment,
90
+ },
91
+ },
92
+ ],
93
+ });
94
+ const cfnModel = model.node.findChild("Model");
95
+ cfnModel.addPropertyOverride("PrimaryContainer.ModelDataSource.S3DataSource.S3Uri", props.modelData.bucket.s3UrlForObject(props.modelData.compiledArtifactS3Prefix));
96
+ cfnModel.addPropertyOverride("PrimaryContainer.ModelDataSource.S3DataSource.S3DataType", "S3Prefix");
97
+ cfnModel.addPropertyOverride("PrimaryContainer.ModelDataSource.S3DataSource.CompressionType", "None");
98
+ props.modelData.bucket.grantRead(model);
99
+ model.node.addDependency(deploy);
100
+ const endpointConfig = new sagemaker.EndpointConfig(this, "EndpointConfig", {
101
+ instanceProductionVariants: [
102
+ {
103
+ model,
104
+ variantName: "PrimaryVariant",
105
+ instanceType: sagemaker.InstanceType.of(instanceType.toString()),
106
+ },
107
+ ],
108
+ });
109
+ const cfnEndpointConfig = endpointConfig.node.findChild("EndpointConfig");
110
+ const volumeSize = aws_cdk_lib_1.Size.gibibytes(props.volumeSize?.toGibibytes() ??
111
+ (props.modelData.parameters.toBilion() * 2.5 > 512
112
+ ? 512
113
+ : props.modelData.parameters.toBilion() * 2.5));
114
+ cfnEndpointConfig.addPropertyOverride("ProductionVariants.0.VolumeSizeInGB", volumeSize.toGibibytes());
115
+ const modelDataDownloadTimeout = props.modelDataDownloadTimeout ??
116
+ inferenceModelDataDownloadTime(volumeSize);
117
+ cfnEndpointConfig.addPropertyOverride("ProductionVariants.0.ModelDataDownloadTimeoutInSeconds", modelDataDownloadTimeout.toSeconds());
118
+ cfnEndpointConfig.addPropertyOverride("ProductionVariants.0.ContainerStartupHealthCheckTimeoutInSeconds", (props.containerStartupHealthCheckTimeout ?? modelDataDownloadTimeout).toSeconds());
119
+ const endpoint = new sagemaker.Endpoint(this, "Endpoint", {
120
+ endpointConfig,
121
+ });
122
+ this.endpointArn = endpoint.endpointArn;
123
+ this.endpointName = endpoint.endpointName;
124
+ this.endpoint = endpoint;
125
+ }
126
+ grantInvoke(grantee) {
127
+ return this.endpoint.grantInvoke(grantee);
128
+ }
129
+ selectInstanceTypeByTpDegree(tpDegree) {
130
+ const instanceTypes = [
131
+ neuronx_instance_type_1.NeuronxInstanceType.INF2_8XLARGE,
132
+ neuronx_instance_type_1.NeuronxInstanceType.INF2_24XLARGE,
133
+ neuronx_instance_type_1.NeuronxInstanceType.INF2_48XLARGE,
134
+ ];
135
+ for (const instanceType of instanceTypes) {
136
+ if (tpDegree <= instanceType.acceleratorChips.neuronxCores) {
137
+ return instanceType;
138
+ }
139
+ }
140
+ throw new Error("This model is too large, I can not support this model current version.");
141
+ }
142
+ }
143
+ exports.TransformersNeuronxSageMakerRealtimeInferenceEndpoint = TransformersNeuronxSageMakerRealtimeInferenceEndpoint;
144
+ _b = JSII_RTTI_SYMBOL_1;
145
+ TransformersNeuronxSageMakerRealtimeInferenceEndpoint[_b] = { fqn: "aws-cdk-neuronx-patterns.TransformersNeuronxSageMakerRealtimeInferenceEndpoint", version: "0.0.4" };
146
+ function inferenceModelDataDownloadTime(volumeSize) {
147
+ const seconds = volumeSize.toGibibytes() * 15;
148
+ return aws_cdk_lib_1.Duration.seconds(seconds < 3600 ? seconds : 3600);
149
+ }
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXJzLW5ldXJvbngtc2FnZW1ha2VyLXJlYWx0aW1lLWluZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90cmFuc2Zvcm1lcnMtbmV1cm9ueC1zYWdlbWFrZXItcmVhbHRpbWUtaW5mZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQTRCO0FBQzVCLDBEQUEwRDtBQUMxRCw2Q0FBNkM7QUFHN0MscUVBSXVDO0FBRXZDLDJDQUF1QztBQUN2QyxtQ0FBMkU7QUFFM0UsbUVBQThEO0FBQzlELHlDQUE4QztBQW1DOUMsTUFBYSw4Q0FBOEM7SUFDekQsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFlLEVBQ2YsTUFBYyxFQUNkLE9BQW1DO1FBRW5DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQztRQUM5RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLFFBQVEsSUFBSSxnQkFBUSxDQUFDLFlBQVksQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FDWixPQUFPLENBQUMsY0FBYyxFQUFFLFFBQVE7WUFDaEMsSUFBQSxtQkFBWSxFQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQy9CLFVBQVU7Z0JBQ1YsVUFBVTthQUNYLENBQUMsQ0FBQztRQUNMLE9BQU8sSUFBSSw4Q0FBOEMsQ0FBQztZQUN4RCxNQUFNO1lBQ04sd0JBQXdCLEVBQUUsTUFBTTtZQUNoQyxVQUFVO1lBQ1YsVUFBVTtZQUNWLFFBQVE7WUFDUixRQUFRO1lBQ1IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtZQUNwQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNE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Q0FBQztJQUMzQixDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQW1CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFFBQWdCO1FBQ25ELE1BQU0sYUFBYSxHQUFHO1lBQ3BCLDJDQUFtQixDQUFDLFlBQVk7WUFDaEMsMkNBQW1CLENBQUMsYUFBYTtZQUNqQywyQ0FBbUIsQ0FBQyxhQUFhO1NBQ2xDLENBQUM7UUFDRixLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLElBQUksUUFBUSxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDM0QsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RSxDQUN6RSxDQUFDO0lBQ0osQ0FBQzs7QUExSUgsc0hBMklDOzs7QUFFRCxTQUFTLDhCQUE4QixDQUFDLFVBQWdCO0lBQ3RELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDOUMsT0FBTyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHNhZ2VtYWtlciBmcm9tIFwiQGF3cy1jZGsvYXdzLXNhZ2VtYWtlci1hbHBoYVwiO1xuaW1wb3J0IHsgRHVyYXRpb24sIFNpemUgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEdyYW50LCBJR3JhbnRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQge1xuICBCdWNrZXREZXBsb3ltZW50LFxuICBJU291cmNlLFxuICBTb3VyY2UsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgQ2ZuRW5kcG9pbnRDb25maWcsIENmbk1vZGVsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zYWdlbWFrZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb21waWxlT3B0aW9ucywgT3B0TGV2ZWwsIFBhcmFtZXRlcnMsIFF1YW50RHR5cGUgfSBmcm9tIFwiLi9tb2RlbFwiO1xuaW1wb3J0IHsgTmV1cm9ueENvbXBpbGUgfSBmcm9tIFwiLi9uZXVyb254LWNvbXBpbGVcIjtcbmltcG9ydCB7IE5ldXJvbnhJbnN0YW5jZVR5cGUgfSBmcm9tIFwiLi9uZXVyb254LWluc3RhbmNlLXR5cGVcIjtcbmltcG9ydCB7IGNhbGNUcERlZ3JlZSB9IGZyb20gXCIuL3ByaXZhdGUvdXRpbFwiO1xuXG4vKipcbiAqIFByZWNvbXBpbGVkIG1vZGVsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRNb2RlbE9wdGlvbnMge1xuICAvKipcbiAgICogTmV1cm9ueCBjb21waWxlIG9wdGlvbnMuXG4gICAqIEBkZWZhdWx0IC0gRWFjaCBwcm9wZXJ0aWVzIGFyZSBzZXQgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBpbGVPcHRpb25zPzogQ29tcGlsZU9wdGlvbnM7XG4gIC8qKlxuICAgKiBDb2RlIHVzZWQgZm9yIGluZmVyZW5jZVxuICAgKiBAZGVmYXVsdCAtIHVzaW5nIHRoZSBwcmVkZWZpbmVkIGNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGNvZGU/OiBJU291cmNlO1xuICAvKipcbiAgICogTW9kZWwgSUQgb3Igc2F2ZWQgcGF0aFxuICAgKiBAZGVmYXVsdCBcIi4vbW9kZWxcIlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxJZE9yUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdoZXJlIGNvbXBpbGVkIGFydGlmYWN0cyAoaS5lLiB4eHgubmVmZikgYXJlIHN0b3JlZFxuICAgKiBAZGVmYXVsdCBcIi4vY29tcGlsZWRcIlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsZWRBcnRpZmFjdFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0Q29tcGlsZWRNb2RlbE9wdGlvbnMgZXh0ZW5kcyBDb21waWxlZE1vZGVsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgb2YgbW9kZWwuXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJzO1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtZXJzTmV1cm9ueFNhZ2VNYWtlckluZmVyZW5jZU1vZGVsRGF0YSB7XG4gIHN0YXRpYyBmcm9tQnVja2V0KFxuICAgIGJ1Y2tldDogSUJ1Y2tldCxcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBvcHRpb25zOiBCdWNrZXRDb21waWxlZE1vZGVsT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgblBvc2l0aW9ucyA9IG9wdGlvbnMuY29tcGlsZU9wdGlvbnM/Lm5Qb3NpdGlvbnMgPz8gNDA5NjtcbiAgICBjb25zdCBxdWFudER0eXBlID0gb3B0aW9ucy5jb21waWxlT3B0aW9ucz8ucXVhbnREdHlwZTtcbiAgICBjb25zdCBvcHRMZXZlbCA9IG9wdGlvbnMuY29tcGlsZU9wdGlvbnM/Lm9wdExldmVsID8/IE9wdExldmVsLkJFU1RfQkFMQU5DRTtcbiAgICBjb25zdCB0cERlZ3JlZSA9XG4gICAgICBvcHRpb25zLmNvbXBpbGVPcHRpb25zPy50cERlZ3JlZSA/P1xuICAgICAgY2FsY1RwRGVncmVlKG9wdGlvbnMucGFyYW1ldGVycywge1xuICAgICAgICBuUG9zaXRpb25zLFxuICAgICAgICBxdWFudER0eXBlLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcnNOZXVyb254U2FnZU1ha2VySW5mZXJlbmNlTW9kZWxEYXRhKHtcbiAgICAgIGJ1Y2tldCxcbiAgICAgIGNvbXBpbGVkQXJ0aWZhY3RTM1ByZWZpeDogcHJlZml4LFxuICAgICAgblBvc2l0aW9ucyxcbiAgICAgIHF1YW50RHR5cGUsXG4gICAgICBvcHRMZXZlbCxcbiAgICAgIHRwRGVncmVlLFxuICAgICAgY29kZTogb3B0aW9ucy5jb2RlLFxuICAgICAgbW9kZWxJZE9yUGF0aDogb3B0aW9ucy5tb2RlbElkT3JQYXRoLFxuICAgICAgcGFyYW1ldGVyczogb3B0aW9ucy5wYXJhbWV0ZXJzLFxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBmcm9tTmV1cm9ueENvbXBpbGUoY29tcGlsZTogTmV1cm9ueENvbXBpbGUsIGNvZGU/OiBJU291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcnNOZXVyb254U2FnZU1ha2VySW5mZXJlbmNlTW9kZWxEYXRhKHtcbiAgICAgIC4uLmNvbXBpbGUsXG4gICAgICBidWNrZXQ6IGNvbXBpbGUuY29tcGlsZWRBcnRpZmFjdFMzQnVja2V0LFxuICAgICAgY29tcGlsZWRBcnRpZmFjdFMzUHJlZml4OiBjb21waWxlLmNvbXBpbGVkQXJ0aWZhY3RTM1ByZWZpeCxcbiAgICAgIGNvZGUsXG4gICAgfSk7XG4gIH1cbiAgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0O1xuICByZWFkb25seSBjb21waWxlZEFydGlmYWN0UzNQcmVmaXg6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogSVNvdXJjZTtcbiAgcmVhZG9ubHkgdHBEZWdyZWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVhbnREdHlwZT86IFF1YW50RHR5cGU7XG4gIHJlYWRvbmx5IG5Qb3NpdGlvbnM6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3B0TGV2ZWw6IE9wdExldmVsO1xuICByZWFkb25seSBtb2RlbElkT3JQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBjb21waWxlZEFydGlmYWN0UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogUGFyYW1ldGVycztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICByZWFkb25seSBidWNrZXQ6IElCdWNrZXQ7XG4gICAgcmVhZG9ubHkgY29tcGlsZWRBcnRpZmFjdFMzUHJlZml4OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdHBEZWdyZWU6IG51bWJlcjtcbiAgICByZWFkb25seSBxdWFudER0eXBlPzogUXVhbnREdHlwZTtcbiAgICByZWFkb25seSBuUG9zaXRpb25zOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgb3B0TGV2ZWw6IE9wdExldmVsO1xuICAgIHJlYWRvbmx5IGNvZGU/OiBJU291cmNlO1xuICAgIHJlYWRvbmx5IG1vZGVsSWRPclBhdGg/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY29tcGlsZWRBcnRpZmFjdFBhdGg/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGFyYW1ldGVyczogUGFyYW1ldGVycztcbiAgfSkge1xuICAgIHRoaXMuYnVja2V0ID0gb3B0aW9ucy5idWNrZXQ7XG4gICAgdGhpcy5jb21waWxlZEFydGlmYWN0UzNQcmVmaXggPSBvcHRpb25zLmNvbXBpbGVkQXJ0aWZhY3RTM1ByZWZpeDtcbiAgICB0aGlzLmNvZGUgPVxuICAgICAgb3B0aW9ucy5jb2RlID8/XG4gICAgICBTb3VyY2UuYXNzZXQoXG4gICAgICAgIGpvaW4oX19kaXJuYW1lLCBcIi4uL3NjcmlwdHMvaW5mZXJlbmNlL3RyYW5zZm9ybWVycy1uZXVyb254L2NvZGVcIiksXG4gICAgICApO1xuICAgIHRoaXMudHBEZWdyZWUgPSBvcHRpb25zLnRwRGVncmVlO1xuICAgIHRoaXMucXVhbnREdHlwZSA9IG9wdGlvbnMucXVhbnREdHlwZTtcbiAgICB0aGlzLm5Qb3NpdGlvbnMgPSBvcHRpb25zLm5Qb3NpdGlvbnM7XG4gICAgdGhpcy5vcHRMZXZlbCA9IG9wdGlvbnMub3B0TGV2ZWw7XG4gICAgdGhpcy5tb2RlbElkT3JQYXRoID0gb3B0aW9ucy5tb2RlbElkT3JQYXRoO1xuICAgIHRoaXMuY29tcGlsZWRBcnRpZmFjdFBhdGggPSBvcHRpb25zLmNvbXBpbGVkQXJ0aWZhY3RQYXRoO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVyc05ldXJvbnhTYWdlTWFrZXJSZWFsdGltZUluZmVyZW5jZUVuZHBvaW50UHJvcHMge1xuICAvKipcbiAgICogTW9kZWwgZGF0YSBmb3IgU2FnZU1ha2VyIGluZmVyZW5jZS5cbiAgICogVGhlIG1vZGVsIGRhdGEgcmVxdWlyZXMgYXQgbGVhc3QgY29tcGlsZWQgYXJ0aWZhY3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxEYXRhOiBUcmFuc2Zvcm1lcnNOZXVyb254U2FnZU1ha2VySW5mZXJlbmNlTW9kZWxEYXRhO1xuICAvKipcbiAgICogQW4gaW1hZ2Ugb2YgdGhlIGNvbnRhaW5lciB3aGVyZSB0aGUgaW5mZXJlbmNlIGpvYiBpcyBleGVjdXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlPzogc2FnZW1ha2VyLkNvbnRhaW5lckltYWdlO1xuICAvKipcbiAgICogQSBtYXAgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgaW50byB0aGUgY29udGFpbmVyLlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgdGhlIHByZWRlZmluZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlcXVpcmVkIHRvIHVzZSBOZXVyb254IGhhdmUgYmVlbiBzZXQuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgdHlwZSBvZiBjb21waWxlIHdvcmtlciBpbnN0YW5jZS5cbiAgICogQGRlZmF1bHQgLSBJdCBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgbW9kZWwgcGFyYW1ldGVycyBhbmQgY29tcGlsYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZT86IE5ldXJvbnhJbnN0YW5jZVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSwgb2YgdGhlIE1MIHN0b3JhZ2Ugdm9sdW1lIGF0dGFjaGVkIHRvIGluZGl2aWR1YWwgaW5mZXJlbmNlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZHVjdGlvbiB2YXJpYW50LlxuICAgKiBDdXJyZW50bHkgb25seSBBbWF6b24gRUJTIGdwMiBzdG9yYWdlIHZvbHVtZXMgYXJlIHN1cHBvcnRlZC5cbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2pwL3JlbGVhc2Vub3Rlcy9ob3N0LWluc3RhbmNlLXN0b3JhZ2Utdm9sdW1lcy10YWJsZVxuICAgKiBAZGVmYXVsdCAtIDIuNSBHQiBwZXIgYmlsbGlvbiBwYXJhbWV0ZXIgKE1heCA1MTIgR0IpXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVTaXplPzogU2l6ZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IHZhbHVlLCB0byBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgbW9kZWwgdGhhdCB5b3Ugd2FudCB0byBob3N0IGZyb20gQW1hem9uIFMzXG4gICAqIHRvIHRoZSBpbmRpdmlkdWFsIGluZmVyZW5jZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9kdWN0aW9uIHZhcmlhbnQuXG4gICAqIEBkZWZhdWx0IC0gNjAgc2Vjb25kcywgd2hlbiBgdm9sdW1lU2l6ZWAgbGFyZ2VyIHRoYW4gMzBHQiB0aGVuIDFHQiB4IDE1IHNlY29uZHMgKG1heCA2MCBtaW51dGVzKVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxEYXRhRG93bmxvYWRUaW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCB2YWx1ZSwgZm9yIHlvdXIgaW5mZXJlbmNlIGNvbnRhaW5lciB0byBwYXNzIGhlYWx0aCBjaGVjayBieSBTYWdlTWFrZXIgSG9zdGluZy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2FnZW1ha2VyL2xhdGVzdC9kZy95b3VyLWFsZ29yaXRobXMtaW5mZXJlbmNlLWNvZGUuaHRtbCN5b3VyLWFsZ29yaXRobXMtaW5mZXJlbmNlLWFsZ28tcGluZy1yZXF1ZXN0c1xuICAgKiBAZGVmYXVsdCAtIDYwIHNlY29uZHMsIHdoZW4gc2V0IHRoZSBgbW9kZWxEYXRhRG93bmxvYWRUaW1lb3V0YCB0aGVuIHVzZSBzYW1lIHZhbHVlIChtYXggNjAgbWludXRlcylcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclN0YXJ0dXBIZWFsdGhDaGVja1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybWVyc05ldXJvbnhTYWdlTWFrZXJSZWFsdGltZUluZmVyZW5jZUVuZHBvaW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGVuZHBvaW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludDogc2FnZW1ha2VyLkVuZHBvaW50O1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFRyYW5zZm9ybWVyc05ldXJvbnhTYWdlTWFrZXJSZWFsdGltZUluZmVyZW5jZUVuZHBvaW50UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgY29uc3QgaW1hZ2UgPVxuICAgICAgcHJvcHMuaW1hZ2UgPz9cbiAgICAgIHNhZ2VtYWtlci5Db250YWluZXJJbWFnZS5mcm9tQXNzZXQoXG4gICAgICAgIGpvaW4oX19kaXJuYW1lLCBcIi4uL3NjcmlwdHMvaW5mZXJlbmNlL3RyYW5zZm9ybWVycy1uZXVyb254XCIpLFxuICAgICAgKTtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPVxuICAgICAgcHJvcHMuaW5zdGFuY2VUeXBlID8/XG4gICAgICB0aGlzLnNlbGVjdEluc3RhbmNlVHlwZUJ5VHBEZWdyZWUocHJvcHMubW9kZWxEYXRhLnRwRGVncmVlKTtcbiAgICBjb25zdCBkZXBsb3kgPSBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBcIkNvZGVEZXBsb3ltZW50XCIsIHtcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBwcm9wcy5tb2RlbERhdGEuYnVja2V0LFxuICAgICAgc291cmNlczogW3Byb3BzLm1vZGVsRGF0YS5jb2RlXSxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBqb2luKFxuICAgICAgICBwcm9wcy5tb2RlbERhdGEuY29tcGlsZWRBcnRpZmFjdFMzUHJlZml4LFxuICAgICAgICBcImNvZGVcIixcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3QgbW9kZWwgPSBuZXcgc2FnZW1ha2VyLk1vZGVsKHRoaXMsIFwiTW9kZWxcIiwge1xuICAgICAgY29udGFpbmVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgIE5FVVJPTl9SVF9OVU1fQ09SRVM6IHByb3BzLm1vZGVsRGF0YS50cERlZ3JlZS50b1N0cmluZygpLFxuICAgICAgICAgICAgVFNfREVGQVVMVF9SRVNQT05TRV9USU1FT1VUOiAoNjAgKiA2MCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFRTX0RFRkFVTFRfV09SS0VSU19QRVJfTU9ERUw6IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgIGluc3RhbmNlVHlwZS5hY2NlbGVyYXRvckNoaXBzLm5ldXJvbnhDb3JlcyAvXG4gICAgICAgICAgICAgICAgcHJvcHMubW9kZWxEYXRhLnRwRGVncmVlLFxuICAgICAgICAgICAgKS50b1N0cmluZygpLFxuICAgICAgICAgICAgTU9ERUw6IHByb3BzLm1vZGVsRGF0YS5tb2RlbElkT3JQYXRoID8/IFwiLi9tb2RlbFwiLFxuICAgICAgICAgICAgQ09NUElMRURfQVJUSUZBQ1Q6XG4gICAgICAgICAgICAgIHByb3BzLm1vZGVsRGF0YS5jb21waWxlZEFydGlmYWN0UGF0aCA/PyBcIi4vY29tcGlsZWRcIixcbiAgICAgICAgICAgIFRQX0RFR1JFRTogcHJvcHMubW9kZWxEYXRhLnRwRGVncmVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBOX1BPU0lUSU9OUzogcHJvcHMubW9kZWxEYXRhLm5Qb3NpdGlvbnMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIE9QVF9MRVZFTDogcHJvcHMubW9kZWxEYXRhLm9wdExldmVsLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBRVUFOVF9EVFlQRTogcHJvcHMubW9kZWxEYXRhLnF1YW50RHR5cGU/LnRvU3RyaW5nKCkgPz8gXCJcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNmbk1vZGVsID0gbW9kZWwubm9kZS5maW5kQ2hpbGQoXCJNb2RlbFwiKSBhcyBDZm5Nb2RlbDtcbiAgICBjZm5Nb2RlbC5hZGRQcm9wZXJ0eU92ZXJyaWRlKFxuICAgICAgXCJQcmltYXJ5Q29udGFpbmVyLk1vZGVsRGF0YVNvdXJjZS5TM0RhdGFTb3VyY2UuUzNVcmlcIixcbiAgICAgIHByb3BzLm1vZGVsRGF0YS5idWNrZXQuczNVcmxGb3JPYmplY3QoXG4gICAgICAgIHByb3BzLm1vZGVsRGF0YS5jb21waWxlZEFydGlmYWN0UzNQcmVmaXgsXG4gICAgICApLFxuICAgICk7XG4gICAgY2ZuTW9kZWwuYWRkUHJvcGVydHlPdmVycmlkZShcbiAgICAgIFwiUHJpbWFyeUNvbnRhaW5lci5Nb2RlbERhdGFTb3VyY2UuUzNEYXRhU291cmNlLlMzRGF0YVR5cGVcIixcbiAgICAgIFwiUzNQcmVmaXhcIixcbiAgICApO1xuICAgIGNmbk1vZGVsLmFkZFByb3BlcnR5T3ZlcnJpZGUoXG4gICAgICBcIlByaW1hcnlDb250YWluZXIuTW9kZWxEYXRhU291cmNlLlMzRGF0YVNvdXJjZS5Db21wcmVzc2lvblR5cGVcIixcbiAgICAgIFwiTm9uZVwiLFxuICAgICk7XG4gICAgcHJvcHMubW9kZWxEYXRhLmJ1Y2tldC5ncmFudFJlYWQobW9kZWwpO1xuICAgIG1vZGVsLm5vZGUuYWRkRGVwZW5kZW5jeShkZXBsb3kpO1xuICAgIGNvbnN0IGVuZHBvaW50Q29uZmlnID0gbmV3IHNhZ2VtYWtlci5FbmRwb2ludENvbmZpZyhcbiAgICAgIHRoaXMsXG4gICAgICBcIkVuZHBvaW50Q29uZmlnXCIsXG4gICAgICB7XG4gICAgICAgIGluc3RhbmNlUHJvZHVjdGlvblZhcmlhbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICB2YXJpYW50TmFtZTogXCJQcmltYXJ5VmFyaWFudFwiLFxuICAgICAgICAgICAgaW5zdGFuY2VUeXBlOiBzYWdlbWFrZXIuSW5zdGFuY2VUeXBlLm9mKGluc3RhbmNlVHlwZS50b1N0cmluZygpKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGNmbkVuZHBvaW50Q29uZmlnID0gZW5kcG9pbnRDb25maWcubm9kZS5maW5kQ2hpbGQoXG4gICAgICBcIkVuZHBvaW50Q29uZmlnXCIsXG4gICAgKSBhcyBDZm5FbmRwb2ludENvbmZpZztcbiAgICBjb25zdCB2b2x1bWVTaXplID0gU2l6ZS5naWJpYnl0ZXMoXG4gICAgICBwcm9wcy52b2x1bWVTaXplPy50b0dpYmlieXRlcygpID8/XG4gICAgICAgIChwcm9wcy5tb2RlbERhdGEucGFyYW1ldGVycy50b0JpbGlvbigpICogMi41ID4gNTEyXG4gICAgICAgICAgPyA1MTJcbiAgICAgICAgICA6IHByb3BzLm1vZGVsRGF0YS5wYXJhbWV0ZXJzLnRvQmlsaW9uKCkgKiAyLjUpLFxuICAgICk7XG4gICAgY2ZuRW5kcG9pbnRDb25maWcuYWRkUHJvcGVydHlPdmVycmlkZShcbiAgICAgIFwiUHJvZHVjdGlvblZhcmlhbnRzLjAuVm9sdW1lU2l6ZUluR0JcIixcbiAgICAgIHZvbHVtZVNpemUudG9HaWJpYnl0ZXMoKSxcbiAgICApO1xuICAgIGNvbnN0IG1vZGVsRGF0YURvd25sb2FkVGltZW91dCA9XG4gICAgICBwcm9wcy5tb2RlbERhdGFEb3dubG9hZFRpbWVvdXQgPz9cbiAgICAgIGluZmVyZW5jZU1vZGVsRGF0YURvd25sb2FkVGltZSh2b2x1bWVTaXplKTtcbiAgICBjZm5FbmRwb2ludENvbmZpZy5hZGRQcm9wZXJ0eU92ZXJyaWRlKFxuICAgICAgXCJQcm9kdWN0aW9uVmFyaWFudHMuMC5Nb2RlbERhdGFEb3dubG9hZFRpbWVvdXRJblNlY29uZHNcIixcbiAgICAgIG1vZGVsRGF0YURvd25sb2FkVGltZW91dC50b1NlY29uZHMoKSxcbiAgICApO1xuICAgIGNmbkVuZHBvaW50Q29uZmlnLmFkZFByb3BlcnR5T3ZlcnJpZGUoXG4gICAgICBcIlByb2R1Y3Rpb25WYXJpYW50cy4wLkNvbnRhaW5lclN0YXJ0dXBIZWFsdGhDaGVja1RpbWVvdXRJblNlY29uZHNcIixcbiAgICAgIChcbiAgICAgICAgcHJvcHMuY29udGFpbmVyU3RhcnR1cEhlYWx0aENoZWNrVGltZW91dCA/PyBtb2RlbERhdGFEb3dubG9hZFRpbWVvdXRcbiAgICAgICkudG9TZWNvbmRzKCksXG4gICAgKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBzYWdlbWFrZXIuRW5kcG9pbnQodGhpcywgXCJFbmRwb2ludFwiLCB7XG4gICAgICBlbmRwb2ludENvbmZpZyxcbiAgICB9KTtcbiAgICB0aGlzLmVuZHBvaW50QXJuID0gZW5kcG9pbnQuZW5kcG9pbnRBcm47XG4gICAgdGhpcy5lbmRwb2ludE5hbWUgPSBlbmRwb2ludC5lbmRwb2ludE5hbWU7XG4gICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50O1xuICB9XG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZW5kcG9pbnQuZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEluc3RhbmNlVHlwZUJ5VHBEZWdyZWUodHBEZWdyZWU6IG51bWJlcikge1xuICAgIGNvbnN0IGluc3RhbmNlVHlwZXMgPSBbXG4gICAgICBOZXVyb254SW5zdGFuY2VUeXBlLklORjJfOFhMQVJHRSxcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuSU5GMl8yNFhMQVJHRSxcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuSU5GMl80OFhMQVJHRSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgaW5zdGFuY2VUeXBlIG9mIGluc3RhbmNlVHlwZXMpIHtcbiAgICAgIGlmICh0cERlZ3JlZSA8PSBpbnN0YW5jZVR5cGUuYWNjZWxlcmF0b3JDaGlwcy5uZXVyb254Q29yZXMpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGlzIG1vZGVsIGlzIHRvbyBsYXJnZSwgSSBjYW4gbm90IHN1cHBvcnQgdGhpcyBtb2RlbCBjdXJyZW50IHZlcnNpb24uXCIsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmZlcmVuY2VNb2RlbERhdGFEb3dubG9hZFRpbWUodm9sdW1lU2l6ZTogU2l6ZSkge1xuICBjb25zdCBzZWNvbmRzID0gdm9sdW1lU2l6ZS50b0dpYmlieXRlcygpICogMTU7XG4gIHJldHVybiBEdXJhdGlvbi5zZWNvbmRzKHNlY29uZHMgPCAzNjAwID8gc2Vjb25kcyA6IDM2MDApO1xufVxuIl19
package/package.json CHANGED
@@ -38,8 +38,8 @@
38
38
  "devDependencies": {
39
39
  "@aws-cdk/integ-runner": "2.149.0-alpha.0",
40
40
  "@aws-cdk/integ-tests-alpha": "2.149.0-alpha.0",
41
- "@aws-sdk/client-batch": "^3.616.0",
42
- "@types/aws-lambda": "^8.10.141",
41
+ "@aws-sdk/client-batch": "^3.620.0",
42
+ "@types/aws-lambda": "^8.10.142",
43
43
  "@types/jest": "^29.5.12",
44
44
  "@types/node": "^18",
45
45
  "@typescript-eslint/eslint-plugin": "^7",
@@ -60,16 +60,20 @@
60
60
  "jsii-pacmak": "^1.101.0",
61
61
  "jsii-rosetta": "~5.4.0",
62
62
  "prettier": "^3.3.3",
63
- "projen": "^0.84.6",
63
+ "projen": "^0.84.10",
64
64
  "standard-version": "^9",
65
65
  "ts-jest": "^29.2.3",
66
66
  "ts-node": "^10.9.2",
67
- "typescript": "^5.5.3"
67
+ "typescript": "^5.5.4"
68
68
  },
69
69
  "peerDependencies": {
70
+ "@aws-cdk/aws-sagemaker-alpha": "2.149.0-alpha.0",
70
71
  "aws-cdk-lib": "^2.149.0",
71
72
  "constructs": "^10.0.5"
72
73
  },
74
+ "dependencies": {
75
+ "@aws-cdk/aws-sagemaker-alpha": "2.149.0-alpha.0"
76
+ },
73
77
  "keywords": [
74
78
  "cdk",
75
79
  "neuronx"
@@ -87,7 +91,7 @@
87
91
  ]
88
92
  }
89
93
  },
90
- "version": "0.0.2",
94
+ "version": "0.0.4",
91
95
  "jest": {
92
96
  "coverageProvider": "v8",
93
97
  "testMatch": [
@@ -0,0 +1,10 @@
1
+ FROM public.ecr.aws/neuron/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.19.1-ubuntu20.04
2
+
3
+ # https://repost.aws/it/questions/QU2l9P6ZEhSkSL0lFQonOHfQ/a-lambda-failed-to-start-with-the-error-cannot-import-name-is-s3express-bucket-from-botocore-utils
4
+ RUN pip install -U boto3==1.34.151 botocore==1.34.151
5
+ COPY compile.py /usr/local/bin/compile.py
6
+ COPY entrypoint.sh /usr/local/bin/entrypoint.sh
7
+ RUN chmod +x /usr/local/bin/compile.py \
8
+ && chmod +x /usr/local/bin/entrypoint.sh
9
+
10
+ ENTRYPOINT [ "bash", "-m", "entrypoint.sh"]
@@ -0,0 +1,9 @@
1
+ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash &&
2
+ apt-get install git-lfs &&
3
+ git lfs install &&
4
+ git clone https://huggingface.co/${MODEL_ID} model &&
5
+ rm -rf model/.git &&
6
+ python /usr/local/bin/compile.py &&
7
+ aws s3 sync --no-progress ./model ${ARTIFACT_S3_URL}/model &&
8
+ aws s3 sync --no-progress ./compiled ${ARTIFACT_S3_URL}/compiled &&
9
+ echo 'compile completed'
@@ -0,0 +1 @@
1
+ FROM public.ecr.aws/neuron/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.19.1-ubuntu20.04
@@ -0,0 +1,63 @@
1
+ import json
2
+ import os
3
+ from typing import Tuple
4
+ import torch
5
+ from transformers import AutoTokenizer, PreTrainedTokenizer, PreTrainedTokenizerFast
6
+ from transformers_neuronx import NeuronAutoModelForCausalLM
7
+ from transformers_neuronx.config import NeuronConfig, QuantizationConfig
8
+
9
+ model_path = os.environ['MODEL']
10
+ compiled_artifact_path = os.environ['COMPILED_ARTIFACT']
11
+ batch_size = 1
12
+ tp_degree = int(os.environ['TP_DEGREE'])
13
+ amp = "bf16"
14
+ quant_dtype = os.getenv('QUANT_DTYPE')
15
+ n_positions = int(os.environ['N_POSITIONS'])
16
+ opt_level = int(os.getenv('OPT_LEVEL', "2"))
17
+ sequence_length = int(os.getenv('SEQUENCE_LENGTH', n_positions))
18
+ top_k = int(os.getenv('TOP_K', 50))
19
+
20
+ def model_fn(model_dir, context=None):
21
+ tokenizer = AutoTokenizer.from_pretrained(model_path)
22
+ neuron_config = NeuronConfig(
23
+ quant=QuantizationConfig(quant_dtype=quant_dtype, dequant_dtype='bf16') if quant_dtype is not None and quant_dtype != '' else None,
24
+ )
25
+ os.environ['NEURON_CC_FLAGS'] = f"--enable-saturate-infinity --enable-mixed-precision-accumulation --optlevel {opt_level}"
26
+ model = NeuronAutoModelForCausalLM.from_pretrained(
27
+ model_path, # Should reference the split checkpoint produced by "save_pretrained_split"
28
+ batch_size=batch_size, # Batch size must be determined prior to inference time.
29
+ tp_degree=tp_degree, # Controls the number of NeuronCores to execute on. Change to 32 for trn1.32xlarge
30
+ amp=amp, # This automatically casts the weights to the specified dtype.
31
+ n_positions=n_positions,
32
+ neuron_config=neuron_config,
33
+ )
34
+ model.load(compiled_artifact_path)
35
+ model.to_neuron()
36
+ print('Load complete!')
37
+ return model, tokenizer
38
+
39
+
40
+ def input_fn(data, content_type, context=None):
41
+ if content_type != 'application/json':
42
+ raise TypeError('content_type is only allowed application/json')
43
+ return json.loads(data)
44
+
45
+
46
+ def predict_fn(data: dict, model_and_tokenizer: Tuple[NeuronAutoModelForCausalLM, PreTrainedTokenizer | PreTrainedTokenizerFast], context=None):
47
+ model, tokenizer = model_and_tokenizer
48
+ with torch.inference_mode():
49
+ raw_prompt = tokenizer.apply_chat_template(conversation=data["messages"], tokenize=False, add_generation_prompt=True)
50
+ if 'role' in data and data["role"] != '':
51
+ raw_prompt = raw_prompt.replace("assistant", data["role"])
52
+ input_ids = tokenizer.encode(raw_prompt, add_special_tokens=False, return_tensors="pt")
53
+ generated_sequences = model.sample(input_ids, sequence_length=sequence_length, top_k=top_k)
54
+ generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences]
55
+ prompt = [tokenizer.decode(seq) for seq in input_ids][0]
56
+ response = generated_sequences[0].replace(prompt, "").replace(tokenizer.eos_token, "")
57
+ return response.strip()
58
+
59
+
60
+ def output_fn(data, content_type, context=None):
61
+ if content_type != 'application/json':
62
+ raise TypeError('content_type is only allowed application/json')
63
+ return json.dumps({'generated_text' : data})
File without changes