UNPKG

aws-cdk-neuronx-patterns

Version:
153 lines 14.9 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.Model = exports.Parameters = exports.OptLevel = exports.QuantDtype = exports.DataTypeBits = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); var DataTypeBits; (function (DataTypeBits) { DataTypeBits[DataTypeBits["BF16_OR_FP16"] = 16] = "BF16_OR_FP16"; DataTypeBits[DataTypeBits["FP8_OR_INT8"] = 8] = "FP8_OR_INT8"; })(DataTypeBits || (exports.DataTypeBits = DataTypeBits = {})); /** * Quant data type. */ var QuantDtype; (function (QuantDtype) { /** * int8 weight storage. */ QuantDtype["S8"] = "s8"; })(QuantDtype || (exports.QuantDtype = QuantDtype = {})); /** * Optimization level. */ var OptLevel; (function (OptLevel) { /** * enables the core performance optimizations in the compiler, while also minimizing compile time. */ OptLevel[OptLevel["MINIMIZING_COMPILE_TIME"] = 1] = "MINIMIZING_COMPILE_TIME"; /** * provides the best balance between model performance and compile time. */ OptLevel[OptLevel["BEST_BALANCE"] = 2] = "BEST_BALANCE"; /** * may provide additional model execution performance but may incur longer compile times and higher host memory usage during model compilation. */ OptLevel[OptLevel["MODEL_EXECUTION_PERFORMANCE"] = 3] = "MODEL_EXECUTION_PERFORMANCE"; })(OptLevel || (exports.OptLevel = OptLevel = {})); /** * Represents the amount of parameters. */ class Parameters { /** * Create a Parameters representing an amount million. * @param parameters number of parameters millionX * @returns parameters */ static million(parameters) { return new Parameters(parameters * 1000000); } /** * Create a Parameters representing an amount billion. * @param parameters number of parameters billionX * @returns parameters */ static billion(parameters) { return new Parameters(parameters * 1000000000); } constructor( /** * number of paremters. */ parameters) { this.parameters = parameters; } /** * Return this number of parameters as million. * @returns This number of parameters as million. */ toMillion() { return this.parameters / 1000000; } /** * Return this number of parameters as billion. * @returns This number of parameters as billion. */ toBillion() { return this.parameters / 1000000000; } weightSize() { return aws_cdk_lib_1.Size.gibibytes(this.toBillion() * 2.5); } } exports.Parameters = Parameters; _a = JSII_RTTI_SYMBOL_1; Parameters[_a] = { fqn: "aws-cdk-neuronx-patterns.Parameters", version: "0.3.0" }; /** * Compile target model. */ class Model { /** * model informations at HuggingFace * @param modelId model id on the HuggingFace * @param options model basic information * @returns model instance */ static fromHuggingFace(modelId, options) { const parameters = options?.parameters ?? Model.maybeParams(modelId); if (!parameters) { throw new Error("The number of parameters cannot be inferred from the model ID. Set optional parameters."); } return new Model(modelId, options?.modelName ?? modelId, { ...options, parameters, }); } /** * model informations at S3 Bucket * @param bucket Model stored S3 Bucket * @param prefix Model stored objects prefix * @param options model basic information * @returns model instance */ static fromBucket(bucket, prefix, options) { if (aws_cdk_lib_1.Token.isUnresolved(prefix) && !options?.modelName) { throw new Error("ModelName is required when prefix is unresolved"); } const modelName = options?.modelName ?? prefix.split("/").slice(-1)[0]; const parameters = options?.parameters ?? Model.maybeParams(modelName); if (!parameters) { throw new Error("The number of parameters cannot be inferred from the model ID. Set optional parameters."); } return new Model(bucket.s3UrlForObject(prefix), modelName, { ...options, parameters }, bucket, prefix); } static maybeParams(source) { try { const billion = source.match(/-(\d+)[bB]/); if (billion?.[1]) { return Parameters.billion(parseInt(billion[1])); } const million = source.match(/-(\d+)[mM]/); if (million?.[1]) { return Parameters.million(parseInt(million[1])); } } catch { // NOP } return undefined; } constructor(modelId, modelName, options, bucket, prefix) { this.modelId = modelId; this.modelName = modelName; this.options = options; this.bucket = bucket; this.prefix = prefix; } } exports.Model = Model; _b = JSII_RTTI_SYMBOL_1; Model[_b] = { fqn: "aws-cdk-neuronx-patterns.Model", version: "0.3.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFzZS9uZXVyb254L21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQTBDO0FBRzFDLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN0QixnRUFBaUIsQ0FBQTtJQUNqQiw2REFBZSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxZQUFZLDRCQUFaLFlBQVksUUFHdkI7QUFFRDs7R0FFRztBQUNILElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQjs7T0FFRztJQUNILHVCQUFTLENBQUE7QUFDWCxDQUFDLEVBTFcsVUFBVSwwQkFBVixVQUFVLFFBS3JCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFFBYVg7QUFiRCxXQUFZLFFBQVE7SUFDbEI7O09BRUc7SUFDSCw2RUFBMkIsQ0FBQTtJQUMzQjs7T0FFRztJQUNILHVEQUFnQixDQUFBO0lBQ2hCOztPQUVHO0lBQ0gscUZBQStCLENBQUE7QUFDakMsQ0FBQyxFQWJXLFFBQVEsd0JBQVIsUUFBUSxRQWFuQjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBQ3JCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQWtCO1FBQy9CLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFrQjtRQUMvQixPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0Q7SUFDRTs7T0FFRztJQUNjLFVBQWtCO1FBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFDbEMsQ0FBQztJQUNKOzs7T0FHRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBQ25DLENBQUM7SUFDRDs7O09BR0c7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TixNQUFNLENBQVU7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUN2QixDQUFDOztBQWxFTixzQkFtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplLCBUb2tlbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcblxuZXhwb3J0IGVudW0gRGF0YVR5cGVCaXRzIHtcbiAgQkYxNl9PUl9GUDE2ID0gMTYsXG4gIEZQOF9PUl9JTlQ4ID0gOCxcbn1cblxuLyoqXG4gKiBRdWFudCBkYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFF1YW50RHR5cGUge1xuICAvKipcbiAgICogaW50OCB3ZWlnaHQgc3RvcmFnZS5cbiAgICovXG4gIFM4ID0gXCJzOFwiLFxufVxuXG4vKipcbiAqIE9wdGltaXphdGlvbiBsZXZlbC5cbiAqL1xuZXhwb3J0IGVudW0gT3B0TGV2ZWwge1xuICAvKipcbiAgICogZW5hYmxlcyB0aGUgY29yZSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGluIHRoZSBjb21waWxlciwgd2hpbGUgYWxzbyBtaW5pbWl6aW5nIGNvbXBpbGUgdGltZS5cbiAgICovXG4gIE1JTklNSVpJTkdfQ09NUElMRV9USU1FID0gMSxcbiAgLyoqXG4gICAqIHByb3ZpZGVzIHRoZSBiZXN0IGJhbGFuY2UgYmV0d2VlbiBtb2RlbCBwZXJmb3JtYW5jZSBhbmQgY29tcGlsZSB0aW1lLlxuICAgKi9cbiAgQkVTVF9CQUxBTkNFID0gMixcbiAgLyoqXG4gICAqIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgbW9kZWwgZXhlY3V0aW9uIHBlcmZvcm1hbmNlIGJ1dCBtYXkgaW5jdXIgbG9uZ2VyIGNvbXBpbGUgdGltZXMgYW5kIGhpZ2hlciBob3N0IG1lbW9yeSB1c2FnZSBkdXJpbmcgbW9kZWwgY29tcGlsYXRpb24uXG4gICAqL1xuICBNT0RFTF9FWEVDVVRJT05fUEVSRk9STUFOQ0UgPSAzLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBQYXJhbWV0ZXJzIHJlcHJlc2VudGluZyBhbiBhbW91bnQgbWlsbGlvbi5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgbnVtYmVyIG9mIHBhcmFtZXRlcnMgbWlsbGlvblhcbiAgICogQHJldHVybnMgcGFyYW1ldGVyc1xuICAgKi9cbiAgc3RhdGljIG1pbGxpb24ocGFyYW1ldGVyczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJzKHBhcmFtZXRlcnMgKiAxMDAwMDAwKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgUGFyYW1ldGVycyByZXByZXNlbnRpbmcgYW4gYW1vdW50IGJpbGxpb24uXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJpbGxpb25YXG4gICAqIEByZXR1cm5zIHBhcmFtZXRlcnNcbiAgICovXG4gIHN0YXRpYyBiaWxsaW9uKHBhcmFtZXRlcnM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVycyhwYXJhbWV0ZXJzICogMTAwMDAwMDAwMCk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBudW1iZXIgb2YgcGFyZW10ZXJzLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogbnVtYmVyLFxuICApIHt9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhpcyBudW1iZXIgb2YgcGFyYW1ldGVycyBhcyBtaWxsaW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFzIG1pbGxpb24uXG4gICAqL1xuICB0b01pbGxpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycyAvIDEwMDAwMDA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGlzIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFzIGJpbGxpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYXMgYmlsbGlvbi5cbiAgICovXG4gIHRvQmlsbGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzIC8gMTAwMDAwMDAwMDtcbiAgfVxuICB3ZWlnaHRTaXplKCkge1xuICAgIHJldHVybiBTaXplLmdpYmlieXRlcyh0aGlzLnRvQmlsbGlvbigpICogMi41KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ29uZmlnIHtcbiAgcmVhZG9ubHkgbGF5ZXJzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVtYmVkZGluZ0RpbWVuc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBhdHRlbnRpb25IZWFkczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGFyZ2V0IG1vZGVsIGJhc2ljIGluZnJvbWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxPcHRpb25zIHtcbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogUGFyYW1ldGVycztcbiAgcmVhZG9ubHkgY29uZmlnPzogTW9kZWxDb25maWc7XG4gIHJlYWRvbmx5IG1vZGVsTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21waWxlIHRhcmdldCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsIHtcbiAgLyoqXG4gICAqIG1vZGVsIGluZm9ybWF0aW9ucyBhdCBIdWdnaW5nRmFjZVxuICAgKiBAcGFyYW0gbW9kZWxJZCBtb2RlbCBpZCBvbiB0aGUgSHVnZ2luZ0ZhY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgbW9kZWwgYmFzaWMgaW5mb3JtYXRpb25cbiAgICogQHJldHVybnMgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBmcm9tSHVnZ2luZ0ZhY2UobW9kZWxJZDogc3RyaW5nLCBvcHRpb25zPzogTW9kZWxPcHRpb25zKSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnM/LnBhcmFtZXRlcnMgPz8gTW9kZWwubWF5YmVQYXJhbXMobW9kZWxJZCk7XG4gICAgaWYgKCFwYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBtb2RlbCBJRC4gU2V0IG9wdGlvbmFsIHBhcmFtZXRlcnMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsKG1vZGVsSWQsIG9wdGlvbnM/Lm1vZGVsTmFtZSA/PyBtb2RlbElkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogbW9kZWwgaW5mb3JtYXRpb25zIGF0IFMzIEJ1Y2tldFxuICAgKiBAcGFyYW0gYnVja2V0IE1vZGVsIHN0b3JlZCBTMyBCdWNrZXRcbiAgICogQHBhcmFtIHByZWZpeCBNb2RlbCBzdG9yZWQgb2JqZWN0cyBwcmVmaXhcbiAgICogQHBhcmFtIG9wdGlvbnMgbW9kZWwgYmFzaWMgaW5mb3JtYXRpb25cbiAgICogQHJldHVybnMgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBmcm9tQnVja2V0KGJ1Y2tldDogSUJ1Y2tldCwgcHJlZml4OiBzdHJpbmcsIG9wdGlvbnM/OiBNb2RlbE9wdGlvbnMpIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHByZWZpeCkgJiYgIW9wdGlvbnM/Lm1vZGVsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWxOYW1lIGlzIHJlcXVpcmVkIHdoZW4gcHJlZml4IGlzIHVucmVzb2x2ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsTmFtZSA9IG9wdGlvbnM/Lm1vZGVsTmFtZSA/PyBwcmVmaXguc3BsaXQoXCIvXCIpLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gb3B0aW9ucz8ucGFyYW1ldGVycyA/PyBNb2RlbC5tYXliZVBhcmFtcyhtb2RlbE5hbWUpO1xuICAgIGlmICghcGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSB0aGUgbW9kZWwgSUQuIFNldCBvcHRpb25hbCBwYXJhbWV0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbChcbiAgICAgIGJ1Y2tldC5zM1VybEZvck9iamVjdChwcmVmaXgpLFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgeyAuLi5vcHRpb25zLCBwYXJhbWV0ZXJzIH0sXG4gICAgICBidWNrZXQsXG4gICAgICBwcmVmaXgsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBtYXliZVBhcmFtcyhzb3VyY2U6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiaWxsaW9uID0gc291cmNlLm1hdGNoKC8tKFxcZCspW2JCXS8pO1xuICAgICAgaWYgKGJpbGxpb24/LlsxXSkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVycy5iaWxsaW9uKHBhcnNlSW50KGJpbGxpb25bMV0pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1pbGxpb24gPSBzb3VyY2UubWF0Y2goLy0oXFxkKylbbU1dLyk7XG4gICAgICBpZiAobWlsbGlvbj8uWzFdKSB7XG4gICAgICAgIHJldHVybiBQYXJhbWV0ZXJzLm1pbGxpb24ocGFyc2VJbnQobWlsbGlvblsxXSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTk9QXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBtb2RlbElkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgbW9kZWxOYW1lOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgb3B0aW9uczogTW9kZWxPcHRpb25zLFxuICAgIHJlYWRvbmx5IGJ1Y2tldD86IElCdWNrZXQsXG4gICAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nLFxuICApIHt9XG59XG4iXX0=