maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.whl
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.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +1 -0
- maxframe/_utils.cp37-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +9 -8
- maxframe/codegen/spe/core.py +1 -1
- maxframe/codegen/spe/dataframe/__init__.py +1 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
- maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
- maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
- maxframe/codegen/spe/dataframe/groupby.py +88 -0
- maxframe/codegen/spe/dataframe/indexing.py +99 -4
- maxframe/codegen/spe/dataframe/merge.py +38 -1
- maxframe/codegen/spe/dataframe/misc.py +11 -33
- maxframe/codegen/spe/dataframe/reduction.py +32 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +39 -18
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
- maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
- maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
- maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/dataframe/tseries.py +9 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
- maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
- maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
- maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
- maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
- maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
- maxframe/codegen/spe/tensor/__init__.py +3 -0
- maxframe/codegen/spe/tensor/datasource.py +1 -0
- maxframe/codegen/spe/tensor/fft.py +74 -0
- maxframe/codegen/spe/tensor/linalg.py +29 -2
- maxframe/codegen/spe/tensor/misc.py +79 -25
- maxframe/codegen/spe/tensor/spatial.py +45 -0
- maxframe/codegen/spe/tensor/statistics.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
- maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
- maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
- maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
- maxframe/codegen/spe/utils.py +2 -0
- maxframe/config/config.py +73 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +54 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/base.py +2 -1
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/graph/core.cp37-win32.pyd +0 -0
- maxframe/core/graph/entity.py +8 -3
- maxframe/core/mode.py +6 -1
- maxframe/core/operator/base.py +9 -2
- maxframe/core/operator/core.py +10 -2
- maxframe/core/operator/utils.py +13 -0
- maxframe/dataframe/__init__.py +12 -5
- maxframe/dataframe/accessors/__init__.py +1 -1
- maxframe/dataframe/accessors/compat.py +45 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
- maxframe/dataframe/accessors/dict_/contains.py +7 -16
- maxframe/dataframe/accessors/dict_/core.py +48 -0
- maxframe/dataframe/accessors/dict_/getitem.py +17 -21
- maxframe/dataframe/accessors/dict_/length.py +7 -16
- maxframe/dataframe/accessors/dict_/remove.py +6 -18
- maxframe/dataframe/accessors/dict_/setitem.py +8 -18
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
- maxframe/dataframe/accessors/list_/__init__.py +2 -2
- maxframe/dataframe/accessors/list_/core.py +48 -0
- maxframe/dataframe/accessors/list_/getitem.py +12 -19
- maxframe/dataframe/accessors/list_/length.py +7 -16
- maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
- maxframe/dataframe/accessors/string_/__init__.py +4 -1
- maxframe/dataframe/accessors/struct_/__init__.py +37 -0
- maxframe/dataframe/accessors/struct_/accessor.py +39 -0
- maxframe/dataframe/accessors/struct_/core.py +43 -0
- maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
- maxframe/dataframe/accessors/struct_/field.py +123 -0
- maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
- maxframe/dataframe/arithmetic/__init__.py +18 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/maximum.py +33 -0
- maxframe/dataframe/arithmetic/minimum.py +33 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +161 -224
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/core.py +6 -0
- maxframe/dataframe/datasource/direct.py +57 -0
- maxframe/dataframe/datasource/from_dict.py +124 -0
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +77 -0
- maxframe/dataframe/datasource/from_tensor.py +109 -41
- maxframe/dataframe/datasource/read_csv.py +21 -14
- maxframe/dataframe/datasource/read_odps_query.py +29 -6
- maxframe/dataframe/datasource/read_odps_table.py +32 -10
- maxframe/dataframe/datasource/read_parquet.py +38 -39
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +11 -1
- maxframe/dataframe/datastore/direct.py +268 -0
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +36 -4
- maxframe/dataframe/extensions/__init__.py +20 -4
- maxframe/dataframe/extensions/apply_chunk.py +32 -6
- maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
- maxframe/dataframe/extensions/collect_kv.py +126 -0
- maxframe/dataframe/extensions/extract_kv.py +177 -0
- maxframe/dataframe/extensions/flatjson.py +2 -1
- maxframe/dataframe/extensions/map_reduce.py +263 -0
- maxframe/dataframe/extensions/rebalance.py +62 -0
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
- maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
- maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
- maxframe/dataframe/groupby/__init__.py +17 -2
- maxframe/dataframe/groupby/aggregation.py +86 -49
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +19 -5
- maxframe/dataframe/groupby/core.py +116 -16
- maxframe/dataframe/groupby/cum.py +4 -25
- maxframe/dataframe/groupby/expanding.py +264 -0
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +12 -5
- maxframe/dataframe/groupby/head.py +11 -1
- maxframe/dataframe/groupby/rank.py +136 -0
- maxframe/dataframe/groupby/rolling.py +206 -0
- maxframe/dataframe/groupby/shift.py +114 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
- maxframe/dataframe/indexing/__init__.py +22 -2
- maxframe/dataframe/indexing/droplevel.py +195 -0
- maxframe/dataframe/indexing/filter.py +169 -0
- maxframe/dataframe/indexing/get_level_values.py +76 -0
- maxframe/dataframe/indexing/iat.py +45 -0
- maxframe/dataframe/indexing/iloc.py +152 -12
- maxframe/dataframe/indexing/insert.py +46 -18
- maxframe/dataframe/indexing/loc.py +287 -7
- maxframe/dataframe/indexing/reindex.py +14 -5
- maxframe/dataframe/indexing/rename.py +6 -0
- maxframe/dataframe/indexing/rename_axis.py +2 -2
- maxframe/dataframe/indexing/reorder_levels.py +143 -0
- maxframe/dataframe/indexing/reset_index.py +33 -6
- maxframe/dataframe/indexing/sample.py +8 -0
- maxframe/dataframe/indexing/setitem.py +3 -3
- maxframe/dataframe/indexing/swaplevel.py +185 -0
- maxframe/dataframe/indexing/take.py +99 -0
- maxframe/dataframe/indexing/truncate.py +140 -0
- maxframe/dataframe/indexing/where.py +0 -11
- maxframe/dataframe/indexing/xs.py +148 -0
- maxframe/dataframe/merge/__init__.py +15 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine.py +244 -0
- maxframe/dataframe/merge/combine_first.py +120 -0
- maxframe/dataframe/merge/compare.py +387 -0
- maxframe/dataframe/merge/concat.py +183 -0
- maxframe/dataframe/merge/update.py +271 -0
- maxframe/dataframe/misc/__init__.py +28 -11
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +82 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop.py +31 -0
- maxframe/dataframe/misc/drop_duplicates.py +2 -2
- maxframe/dataframe/misc/duplicated.py +2 -2
- maxframe/dataframe/misc/get_dummies.py +5 -1
- maxframe/dataframe/misc/infer_dtypes.py +251 -0
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +125 -18
- maxframe/dataframe/misc/repeat.py +159 -0
- maxframe/dataframe/misc/tests/test_misc.py +48 -3
- maxframe/dataframe/misc/to_numeric.py +3 -0
- maxframe/dataframe/misc/transform.py +12 -5
- maxframe/dataframe/misc/transpose.py +13 -1
- maxframe/dataframe/misc/valid_index.py +115 -0
- maxframe/dataframe/misc/value_counts.py +38 -4
- maxframe/dataframe/missing/checkna.py +14 -6
- maxframe/dataframe/missing/dropna.py +5 -0
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +7 -4
- maxframe/dataframe/reduction/__init__.py +35 -16
- maxframe/dataframe/reduction/aggregation.py +43 -14
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +103 -0
- maxframe/dataframe/reduction/argmin.py +103 -0
- maxframe/dataframe/reduction/core.py +80 -24
- maxframe/dataframe/reduction/count.py +13 -9
- maxframe/dataframe/reduction/cov.py +166 -0
- maxframe/dataframe/reduction/cummax.py +2 -2
- maxframe/dataframe/reduction/cummin.py +2 -2
- maxframe/dataframe/reduction/cumprod.py +2 -2
- maxframe/dataframe/reduction/cumsum.py +2 -2
- maxframe/dataframe/reduction/custom_reduction.py +2 -2
- maxframe/dataframe/reduction/idxmax.py +185 -0
- maxframe/dataframe/reduction/idxmin.py +185 -0
- maxframe/dataframe/reduction/kurtosis.py +37 -30
- maxframe/dataframe/reduction/max.py +2 -2
- maxframe/dataframe/reduction/mean.py +9 -7
- maxframe/dataframe/reduction/median.py +2 -2
- maxframe/dataframe/reduction/min.py +2 -2
- maxframe/dataframe/reduction/mode.py +144 -0
- maxframe/dataframe/reduction/nunique.py +19 -11
- maxframe/dataframe/reduction/prod.py +18 -13
- maxframe/dataframe/reduction/reduction_size.py +2 -2
- maxframe/dataframe/reduction/sem.py +13 -9
- maxframe/dataframe/reduction/skew.py +31 -27
- maxframe/dataframe/reduction/str_concat.py +10 -7
- maxframe/dataframe/reduction/sum.py +18 -14
- maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
- maxframe/dataframe/reduction/unique.py +20 -3
- maxframe/dataframe/reduction/var.py +16 -12
- maxframe/dataframe/reshape/__init__.py +38 -0
- maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
- maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
- maxframe/dataframe/reshape/unstack.py +114 -0
- maxframe/dataframe/sort/__init__.py +16 -1
- maxframe/dataframe/sort/argsort.py +68 -0
- maxframe/dataframe/sort/core.py +2 -1
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/sort/rank.py +147 -0
- maxframe/dataframe/statistics/__init__.py +3 -3
- maxframe/dataframe/statistics/corr.py +1 -0
- maxframe/dataframe/statistics/quantile.py +2 -2
- maxframe/dataframe/tests/test_typing.py +104 -0
- maxframe/dataframe/tests/test_utils.py +66 -2
- maxframe/dataframe/tseries/__init__.py +19 -0
- maxframe/dataframe/tseries/at_time.py +61 -0
- maxframe/dataframe/tseries/between_time.py +122 -0
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +125 -52
- maxframe/dataframe/window/aggregation.py +8 -4
- maxframe/dataframe/window/core.py +14 -1
- maxframe/dataframe/window/ewm.py +1 -3
- maxframe/dataframe/window/expanding.py +37 -35
- maxframe/dataframe/window/rolling.py +49 -39
- maxframe/dataframe/window/tests/test_expanding.py +1 -7
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +7 -4
- maxframe/errors.py +2 -2
- maxframe/io/odpsio/schema.py +9 -3
- maxframe/io/odpsio/tableio.py +7 -2
- maxframe/io/odpsio/tests/test_schema.py +198 -83
- maxframe/learn/__init__.py +10 -2
- maxframe/learn/cluster/__init__.py +15 -0
- maxframe/learn/cluster/_kmeans.py +782 -0
- maxframe/learn/contrib/llm/core.py +18 -7
- maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/config.py +221 -0
- maxframe/learn/contrib/llm/deploy/core.py +247 -0
- maxframe/learn/contrib/llm/deploy/framework.py +35 -0
- maxframe/learn/contrib/llm/deploy/loader.py +360 -0
- maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
- maxframe/learn/contrib/llm/models/__init__.py +1 -0
- maxframe/learn/contrib/llm/models/dashscope.py +12 -6
- maxframe/learn/contrib/llm/models/managed.py +76 -11
- maxframe/learn/contrib/llm/models/openai.py +72 -0
- maxframe/learn/contrib/llm/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/tests/test_core.py +34 -0
- maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
- maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
- maxframe/learn/contrib/llm/text.py +348 -42
- maxframe/learn/contrib/models.py +4 -1
- maxframe/learn/contrib/xgboost/classifier.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +113 -4
- maxframe/learn/contrib/xgboost/predict.py +4 -2
- maxframe/learn/contrib/xgboost/regressor.py +5 -0
- maxframe/learn/contrib/xgboost/train.py +7 -2
- maxframe/learn/core.py +66 -0
- maxframe/learn/linear_model/_base.py +58 -1
- maxframe/learn/linear_model/_lin_reg.py +1 -1
- maxframe/learn/metrics/__init__.py +6 -0
- maxframe/learn/metrics/_classification.py +145 -0
- maxframe/learn/metrics/_ranking.py +477 -0
- maxframe/learn/metrics/_scorer.py +60 -0
- maxframe/learn/metrics/pairwise/__init__.py +21 -0
- maxframe/learn/metrics/pairwise/core.py +77 -0
- maxframe/learn/metrics/pairwise/cosine.py +115 -0
- maxframe/learn/metrics/pairwise/euclidean.py +176 -0
- maxframe/learn/metrics/pairwise/haversine.py +96 -0
- maxframe/learn/metrics/pairwise/manhattan.py +80 -0
- maxframe/learn/metrics/pairwise/pairwise.py +127 -0
- maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
- maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
- maxframe/learn/metrics/tests/__init__.py +13 -0
- maxframe/learn/metrics/tests/test_scorer.py +26 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
- maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
- maxframe/learn/utils/__init__.py +2 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +79 -9
- maxframe/learn/utils/odpsio.py +262 -0
- maxframe/learn/utils/validation.py +2 -2
- maxframe/lib/compat.py +40 -0
- maxframe/lib/dtypes_extension/__init__.py +16 -1
- maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
- maxframe/lib/dtypes_extension/blob.py +304 -0
- maxframe/lib/dtypes_extension/dtypes.py +40 -0
- maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
- maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
- maxframe/lib/filesystem/_oss_lib/common.py +124 -50
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/oss.py +115 -46
- maxframe/lib/filesystem/tests/test_oss.py +74 -36
- maxframe/lib/mmh3.cp37-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +41 -15
- maxframe/protocol.py +12 -0
- maxframe/remote/core.py +4 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp37-win32.pyd +0 -0
- maxframe/serialization/core.pyx +39 -1
- maxframe/serialization/exception.py +2 -4
- maxframe/serialization/numpy.py +11 -0
- maxframe/serialization/pandas.py +46 -9
- maxframe/serialization/serializables/core.py +2 -2
- maxframe/serialization/tests/test_serial.py +31 -4
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/core.py +2 -2
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
- maxframe/tensor/core.py +6 -2
- maxframe/tensor/datasource/tests/test_datasource.py +2 -1
- maxframe/tensor/extensions/__init__.py +2 -0
- maxframe/tensor/extensions/apply_chunk.py +3 -3
- maxframe/tensor/extensions/rebalance.py +65 -0
- maxframe/tensor/fft/__init__.py +32 -0
- maxframe/tensor/fft/core.py +168 -0
- maxframe/tensor/fft/fft.py +112 -0
- maxframe/tensor/fft/fft2.py +118 -0
- maxframe/tensor/fft/fftfreq.py +80 -0
- maxframe/tensor/fft/fftn.py +123 -0
- maxframe/tensor/fft/fftshift.py +79 -0
- maxframe/tensor/fft/hfft.py +112 -0
- maxframe/tensor/fft/ifft.py +114 -0
- maxframe/tensor/fft/ifft2.py +115 -0
- maxframe/tensor/fft/ifftn.py +123 -0
- maxframe/tensor/fft/ifftshift.py +73 -0
- maxframe/tensor/fft/ihfft.py +93 -0
- maxframe/tensor/fft/irfft.py +118 -0
- maxframe/tensor/fft/irfft2.py +62 -0
- maxframe/tensor/fft/irfftn.py +114 -0
- maxframe/tensor/fft/rfft.py +116 -0
- maxframe/tensor/fft/rfft2.py +63 -0
- maxframe/tensor/fft/rfftfreq.py +87 -0
- maxframe/tensor/fft/rfftn.py +113 -0
- maxframe/tensor/indexing/fill_diagonal.py +1 -7
- maxframe/tensor/linalg/__init__.py +7 -0
- maxframe/tensor/linalg/_einsumfunc.py +1025 -0
- maxframe/tensor/linalg/cholesky.py +117 -0
- maxframe/tensor/linalg/einsum.py +339 -0
- maxframe/tensor/linalg/lstsq.py +100 -0
- maxframe/tensor/linalg/matrix_norm.py +75 -0
- maxframe/tensor/linalg/norm.py +249 -0
- maxframe/tensor/linalg/solve.py +72 -0
- maxframe/tensor/linalg/solve_triangular.py +2 -2
- maxframe/tensor/linalg/vector_norm.py +113 -0
- maxframe/tensor/misc/__init__.py +24 -1
- maxframe/tensor/misc/argwhere.py +72 -0
- maxframe/tensor/misc/array_split.py +46 -0
- maxframe/tensor/misc/broadcast_arrays.py +57 -0
- maxframe/tensor/misc/copyto.py +130 -0
- maxframe/tensor/misc/delete.py +104 -0
- maxframe/tensor/misc/dsplit.py +68 -0
- maxframe/tensor/misc/ediff1d.py +74 -0
- maxframe/tensor/misc/expand_dims.py +85 -0
- maxframe/tensor/misc/flip.py +90 -0
- maxframe/tensor/misc/fliplr.py +64 -0
- maxframe/tensor/misc/flipud.py +68 -0
- maxframe/tensor/misc/hsplit.py +85 -0
- maxframe/tensor/misc/insert.py +139 -0
- maxframe/tensor/misc/moveaxis.py +83 -0
- maxframe/tensor/misc/result_type.py +88 -0
- maxframe/tensor/misc/roll.py +124 -0
- maxframe/tensor/misc/rollaxis.py +77 -0
- maxframe/tensor/misc/shape.py +89 -0
- maxframe/tensor/misc/split.py +190 -0
- maxframe/tensor/misc/tile.py +109 -0
- maxframe/tensor/misc/vsplit.py +74 -0
- maxframe/tensor/reduction/array_equal.py +2 -1
- maxframe/tensor/sort/__init__.py +2 -0
- maxframe/tensor/sort/argpartition.py +98 -0
- maxframe/tensor/sort/partition.py +228 -0
- maxframe/tensor/spatial/__init__.py +15 -0
- maxframe/tensor/spatial/distance/__init__.py +17 -0
- maxframe/tensor/spatial/distance/cdist.py +421 -0
- maxframe/tensor/spatial/distance/pdist.py +398 -0
- maxframe/tensor/spatial/distance/squareform.py +153 -0
- maxframe/tensor/special/__init__.py +159 -21
- maxframe/tensor/special/airy.py +55 -0
- maxframe/tensor/special/bessel.py +199 -0
- maxframe/tensor/special/core.py +65 -4
- maxframe/tensor/special/ellip_func_integrals.py +155 -0
- maxframe/tensor/special/ellip_harm.py +55 -0
- maxframe/tensor/special/err_fresnel.py +223 -0
- maxframe/tensor/special/gamma_funcs.py +303 -0
- maxframe/tensor/special/hypergeometric_funcs.py +69 -0
- maxframe/tensor/special/info_theory.py +189 -0
- maxframe/tensor/special/misc.py +21 -0
- maxframe/tensor/statistics/__init__.py +6 -0
- maxframe/tensor/statistics/corrcoef.py +77 -0
- maxframe/tensor/statistics/cov.py +222 -0
- maxframe/tensor/statistics/digitize.py +126 -0
- maxframe/tensor/statistics/histogram.py +520 -0
- maxframe/tensor/statistics/median.py +85 -0
- maxframe/tensor/statistics/ptp.py +89 -0
- maxframe/tensor/utils.py +3 -3
- maxframe/tests/test_udf.py +61 -0
- maxframe/tests/test_utils.py +51 -6
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +130 -9
- maxframe/utils.py +254 -27
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/session/task.py +8 -1
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +28 -1
- maxframe/dataframe/arrays.py +0 -864
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -20,11 +20,16 @@ import pandas as pd
|
|
|
20
20
|
from ....core.entity.output_types import OutputType
|
|
21
21
|
from ....core.operator.base import Operator
|
|
22
22
|
from ....core.operator.core import TileableOperatorMixin
|
|
23
|
-
from ....dataframe.core import SERIES_TYPE
|
|
24
23
|
from ....dataframe.operators import DataFrameOperatorMixin
|
|
25
24
|
from ....dataframe.utils import parse_index
|
|
25
|
+
from ....serialization.serializables import Int32Field
|
|
26
26
|
from ....serialization.serializables.core import Serializable
|
|
27
|
-
from ....serialization.serializables.field import
|
|
27
|
+
from ....serialization.serializables.field import (
|
|
28
|
+
AnyField,
|
|
29
|
+
BoolField,
|
|
30
|
+
DictField,
|
|
31
|
+
StringField,
|
|
32
|
+
)
|
|
28
33
|
|
|
29
34
|
|
|
30
35
|
class LLM(Serializable):
|
|
@@ -39,6 +44,7 @@ class LLMTaskOperator(Operator, DataFrameOperatorMixin):
|
|
|
39
44
|
model = AnyField("model", default=None)
|
|
40
45
|
params = DictField("params", default=None)
|
|
41
46
|
running_options: Dict[str, Any] = DictField("running_options", default=None)
|
|
47
|
+
timeout = Int32Field("timeout", default=None)
|
|
42
48
|
|
|
43
49
|
def __init__(self, output_types=None, **kw):
|
|
44
50
|
if output_types is None:
|
|
@@ -53,11 +59,7 @@ class LLMTaskOperator(Operator, DataFrameOperatorMixin):
|
|
|
53
59
|
col_name = list(outputs.keys())
|
|
54
60
|
columns = parse_index(pd.Index(col_name), store_data=True)
|
|
55
61
|
out_dtypes = pd.Series(list(outputs.values()), index=col_name)
|
|
56
|
-
index_value = index or
|
|
57
|
-
parse_index(pd.RangeIndex(-1), data)
|
|
58
|
-
if isinstance(data, SERIES_TYPE)
|
|
59
|
-
else data.index_value
|
|
60
|
-
)
|
|
62
|
+
index_value = index or data.index_value
|
|
61
63
|
|
|
62
64
|
return self.new_dataframe(
|
|
63
65
|
inputs=[data],
|
|
@@ -73,3 +75,12 @@ class LLMTextGenOperator(LLMTaskOperator, TileableOperatorMixin):
|
|
|
73
75
|
|
|
74
76
|
def get_output_dtypes(self) -> Dict[str, np.dtype]:
|
|
75
77
|
return {"response": np.dtype("O"), "success": np.dtype("bool")}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class LLMTextEmbeddingOp(LLMTaskOperator, TileableOperatorMixin):
|
|
81
|
+
dimensions = Int32Field("dimensions", default=None)
|
|
82
|
+
encoding_format = StringField("encoding_format", default=None)
|
|
83
|
+
simple_output = BoolField("simple_output", default=False)
|
|
84
|
+
|
|
85
|
+
def get_output_dtypes(self) -> Dict[str, np.dtype]:
|
|
86
|
+
return {"response": np.dtype("O"), "success": np.dtype("bool")}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from copy import deepcopy
|
|
16
|
+
from typing import Any, Dict, List, Optional, Union
|
|
17
|
+
|
|
18
|
+
from .....protocol import Serializable
|
|
19
|
+
from .....serialization.serializables import StringField
|
|
20
|
+
from .....serialization.serializables.field import (
|
|
21
|
+
DictField,
|
|
22
|
+
EnumField,
|
|
23
|
+
Int32Field,
|
|
24
|
+
ListField,
|
|
25
|
+
)
|
|
26
|
+
from .....serialization.serializables.field_type import FieldTypes
|
|
27
|
+
from .framework import InferenceFrameworkEnum
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ModelDeploymentConfig(Serializable):
|
|
31
|
+
"""
|
|
32
|
+
Model deployment configuration for extending MaxFrame with custom models.
|
|
33
|
+
|
|
34
|
+
This configuration is designed for users who need to deploy models that are not
|
|
35
|
+
available within MaxFrame's built-in model offerings. It provides a way to specify
|
|
36
|
+
custom deployment solutions by informing each MaxFrame worker which framework to use,
|
|
37
|
+
which model path to load, and how to load it.
|
|
38
|
+
|
|
39
|
+
The configuration assumes that models are already set up in the container image or
|
|
40
|
+
mounted paths, and uses the current deploy_config to load them. Users are responsible
|
|
41
|
+
for ensuring the runtime environment state and compatibility.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
model_name: str
|
|
46
|
+
The name of the model.
|
|
47
|
+
model_file: str
|
|
48
|
+
The file path of the model.
|
|
49
|
+
inference_framework_type: InferenceFrameworkEnum
|
|
50
|
+
The inference framework of the model.
|
|
51
|
+
required_resource_files: List[Union[str, Any]]
|
|
52
|
+
The required resource files of the model.
|
|
53
|
+
load_params: Dict[str, Any]
|
|
54
|
+
The load params of the model.
|
|
55
|
+
required_cpu: int
|
|
56
|
+
The required cpu of the model.
|
|
57
|
+
required_memory: int
|
|
58
|
+
The required memory of the model.
|
|
59
|
+
required_gu: int
|
|
60
|
+
The required gu of the model.
|
|
61
|
+
required_gpu_memory: int
|
|
62
|
+
The required gpu memory of the model.
|
|
63
|
+
device: str
|
|
64
|
+
The device of the model. One of "cpu" or "cuda".
|
|
65
|
+
properties: Dict[str, Any]
|
|
66
|
+
The properties of the model.
|
|
67
|
+
tags: List[str]
|
|
68
|
+
The tags of the model.
|
|
69
|
+
|
|
70
|
+
Notes
|
|
71
|
+
-----
|
|
72
|
+
- Preview version for model deployments, all fields could be changed in the future.
|
|
73
|
+
|
|
74
|
+
**User Responsibility Notice**: Users must have a complete understanding of what
|
|
75
|
+
they are computing and ensure they fully comprehend the implications of their
|
|
76
|
+
configuration choices. You are responsible for:
|
|
77
|
+
|
|
78
|
+
* Ensuring model compatibility with the specified inference framework
|
|
79
|
+
* Verifying that model files exist and are accessible in the runtime environment
|
|
80
|
+
* Confirming that resource requirements (CPU, memory, GPU) are adequate
|
|
81
|
+
* Validating that all dependencies and libraries are properly installed
|
|
82
|
+
* Understanding the computational behavior and characteristics of your chosen model
|
|
83
|
+
|
|
84
|
+
Examples
|
|
85
|
+
--------
|
|
86
|
+
>>> from maxframe.learn.contrib.llm.deploy.config import ModelDeploymentConfig
|
|
87
|
+
>>> from maxframe.learn.contrib.llm.deploy.framework import InferenceFrameworkEnum
|
|
88
|
+
>>> from maxframe.learn.contrib.llm.models.managed import ManagedTextGenLLM
|
|
89
|
+
|
|
90
|
+
>>> # Configure model deployment with VLLM framework
|
|
91
|
+
>>> model_config = ModelDeploymentConfig(
|
|
92
|
+
... # Path to the model files (assumed to be available in container/mount)
|
|
93
|
+
... model_file="/models/Qwen3-4B-Instruct-2507-FP8",
|
|
94
|
+
... # Use VLLM serving framework for text generation
|
|
95
|
+
... inference_framework_type=InferenceFrameworkEnum.VLLM_SERVE_TEXT,
|
|
96
|
+
... # Framework-specific loading parameters
|
|
97
|
+
... load_params={
|
|
98
|
+
... "max_context_tokens": 4096, # Maximum context length for the model
|
|
99
|
+
... "max_startup_wait_seconds": 600 # Max wait time for model startup
|
|
100
|
+
... },
|
|
101
|
+
... # Target device for inference
|
|
102
|
+
... device="cuda",
|
|
103
|
+
... # Resource requirements (2 GPU units)
|
|
104
|
+
... required_gu=2,
|
|
105
|
+
... # Model tags for capabilities
|
|
106
|
+
... tags=["text-generation"],
|
|
107
|
+
... )
|
|
108
|
+
|
|
109
|
+
>>> # Create managed LLM instance with the deployment configuration
|
|
110
|
+
>>> llm = ManagedTextGenLLM(name="my-model", deploy_config=model_config)
|
|
111
|
+
>>> # Generate text using the deployed model.
|
|
112
|
+
>>> result_df = llm.generate(
|
|
113
|
+
... df, # Input DataFrame containing prompts
|
|
114
|
+
... prompt_template=messages, # Template for formatting prompts
|
|
115
|
+
... running_options={
|
|
116
|
+
... "max_context_tokens": 4096, # Runtime context limit
|
|
117
|
+
... },
|
|
118
|
+
... params={
|
|
119
|
+
... "temperature": 0.7, # Sampling temperature
|
|
120
|
+
... "max_tokens": 2048 # Maximum tokens to generate
|
|
121
|
+
... },
|
|
122
|
+
... )
|
|
123
|
+
|
|
124
|
+
To make this model config working with the ManagedTextGenLLM,
|
|
125
|
+
you need to provide a custom image with the required dependencies and model files.
|
|
126
|
+
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
model_name: str = StringField("model_name")
|
|
130
|
+
model_file: str = StringField("model_file")
|
|
131
|
+
inference_framework_type: InferenceFrameworkEnum = EnumField(
|
|
132
|
+
"inference_framework_type", enum_type=InferenceFrameworkEnum
|
|
133
|
+
)
|
|
134
|
+
required_resource_files: List[Union[str, Any]] = ListField(
|
|
135
|
+
"required_resource_files", field_type=FieldTypes.any, default_factory=list
|
|
136
|
+
)
|
|
137
|
+
load_params: Dict[str, Any] = DictField(
|
|
138
|
+
"load_params",
|
|
139
|
+
key_type=FieldTypes.string,
|
|
140
|
+
value_type=FieldTypes.any,
|
|
141
|
+
default_factory=dict,
|
|
142
|
+
)
|
|
143
|
+
required_cpu: Optional[int] = Int32Field("required_cpu", default=None)
|
|
144
|
+
required_memory: Optional[int] = Int32Field("required_memory", default=None)
|
|
145
|
+
required_gu: Optional[int] = Int32Field("required_gu", default=None)
|
|
146
|
+
required_gpu_memory: Optional[int] = Int32Field("required_gpu_memory", default=None)
|
|
147
|
+
device: str = StringField("device")
|
|
148
|
+
properties: Dict[str, Any] = DictField(
|
|
149
|
+
"properties",
|
|
150
|
+
key_type=FieldTypes.string,
|
|
151
|
+
value_type=FieldTypes.any,
|
|
152
|
+
default_factory=dict,
|
|
153
|
+
)
|
|
154
|
+
tags: List[str] = ListField(
|
|
155
|
+
"tags",
|
|
156
|
+
field_type=FieldTypes.string,
|
|
157
|
+
default_factory=list,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def is_reasoning_model(self):
|
|
161
|
+
if self.properties is None:
|
|
162
|
+
return False
|
|
163
|
+
return self.properties.get("reasoning_model", False)
|
|
164
|
+
|
|
165
|
+
def copy(self) -> "ModelDeploymentConfig":
|
|
166
|
+
return deepcopy(self)
|
|
167
|
+
|
|
168
|
+
def __eq__(self, other):
|
|
169
|
+
if not isinstance(other, ModelDeploymentConfig):
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
return (
|
|
173
|
+
self.model_name == other.model_name
|
|
174
|
+
and self.model_file == other.model_file
|
|
175
|
+
and self.inference_framework_type == other.inference_framework_type
|
|
176
|
+
and self.required_resource_files == other.required_resource_files
|
|
177
|
+
and self.load_params == other.load_params
|
|
178
|
+
and self.required_cpu == other.required_cpu
|
|
179
|
+
and self.required_memory == other.required_memory
|
|
180
|
+
and self.required_gu == other.required_gu
|
|
181
|
+
and self.required_gpu_memory == other.required_gpu_memory
|
|
182
|
+
and self.device == other.device
|
|
183
|
+
and self.properties == other.properties
|
|
184
|
+
and self.tags == other.tags
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def __hash__(self):
|
|
188
|
+
return hash(
|
|
189
|
+
(
|
|
190
|
+
self.model_name,
|
|
191
|
+
self.model_file,
|
|
192
|
+
self.inference_framework_type,
|
|
193
|
+
self.required_resource_files,
|
|
194
|
+
self.load_params,
|
|
195
|
+
self.required_cpu,
|
|
196
|
+
self.required_memory,
|
|
197
|
+
self.required_gu,
|
|
198
|
+
self.required_gpu_memory,
|
|
199
|
+
self.device,
|
|
200
|
+
self.properties,
|
|
201
|
+
self.tags,
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
def check_validity(self):
|
|
206
|
+
required_fields = [
|
|
207
|
+
"model_name",
|
|
208
|
+
"model_file",
|
|
209
|
+
"inference_framework_type",
|
|
210
|
+
"device",
|
|
211
|
+
]
|
|
212
|
+
for field in required_fields:
|
|
213
|
+
if getattr(self, field) is None:
|
|
214
|
+
raise ValueError(f"{field} is required")
|
|
215
|
+
|
|
216
|
+
one_of_fields = ["required_cpu", "required_gu"]
|
|
217
|
+
if not any(getattr(self, field) is not None for field in one_of_fields):
|
|
218
|
+
raise ValueError(f"At least one of {one_of_fields} is required")
|
|
219
|
+
|
|
220
|
+
if not self.tags:
|
|
221
|
+
raise ValueError("tags is required")
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import Any, Dict, List, Optional, Union
|
|
16
|
+
|
|
17
|
+
from odps.models import Resource as ODPSResource
|
|
18
|
+
|
|
19
|
+
from .....serialization.serializables import Serializable, StringField
|
|
20
|
+
from .config import ModelDeploymentConfig
|
|
21
|
+
from .framework import InferenceFrameworkEnum
|
|
22
|
+
|
|
23
|
+
_registered_llm_models = {}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ResourceNameTemplate(Serializable):
|
|
27
|
+
"""
|
|
28
|
+
A template-based resource name builder that supports variable substitution.
|
|
29
|
+
All values in the substitution dict will have their hyphens (-) replaced with underscores (_).
|
|
30
|
+
|
|
31
|
+
Example:
|
|
32
|
+
template = ResourceNameTemplate(
|
|
33
|
+
project="my_project",
|
|
34
|
+
schema="schema_{region_id}",
|
|
35
|
+
name="resource_{env}"
|
|
36
|
+
)
|
|
37
|
+
# Render with variables
|
|
38
|
+
full_name = template.build_full_resource_name({"region_id": "cn-hangzhou", "env": "prod"})
|
|
39
|
+
# Result: resource name with cn_hangzhou and prod substituted
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
project: str = StringField("project", default=None)
|
|
43
|
+
schema: str = StringField("schema", default=None)
|
|
44
|
+
name: str = StringField("name")
|
|
45
|
+
|
|
46
|
+
def build_full_resource_name(self, template_vars: Dict[str, Any]):
|
|
47
|
+
"""
|
|
48
|
+
Build full resource name with template variable substitution.
|
|
49
|
+
"""
|
|
50
|
+
normalized_vars = {
|
|
51
|
+
key: str(value).replace("-", "_") for key, value in template_vars.items()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
project, schema, name = self.project, self.schema, self.name
|
|
55
|
+
res_name = ODPSResource.build_full_resource_name(
|
|
56
|
+
name=name, project_name=project, schema_name=schema
|
|
57
|
+
)
|
|
58
|
+
try:
|
|
59
|
+
return res_name.format(**normalized_vars)
|
|
60
|
+
except KeyError:
|
|
61
|
+
# If template variable is missing, return as-is
|
|
62
|
+
return res_name
|
|
63
|
+
|
|
64
|
+
def __eq__(self, other):
|
|
65
|
+
if not isinstance(other, ResourceNameTemplate):
|
|
66
|
+
return False
|
|
67
|
+
return (
|
|
68
|
+
self.project == other.project
|
|
69
|
+
and self.schema == other.schema
|
|
70
|
+
and self.name == other.name
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def __hash__(self):
|
|
74
|
+
return hash((self.project, self.schema, self.name))
|
|
75
|
+
|
|
76
|
+
def to_json(self) -> dict:
|
|
77
|
+
ret = {"name": self.name}
|
|
78
|
+
if self.project:
|
|
79
|
+
ret["project"] = self.project
|
|
80
|
+
if self.schema:
|
|
81
|
+
ret["schema"] = self.schema
|
|
82
|
+
return ret
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def from_json(cls, serialized: dict) -> "ResourceNameTemplate":
|
|
86
|
+
kw = serialized.copy()
|
|
87
|
+
return cls(
|
|
88
|
+
project=kw.get("project"),
|
|
89
|
+
schema=kw.get("schema"),
|
|
90
|
+
name=kw["name"],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def create_model_deployments(
|
|
95
|
+
model_name: str,
|
|
96
|
+
model_file: str,
|
|
97
|
+
inference_frameworks: Union[
|
|
98
|
+
str, InferenceFrameworkEnum, List[InferenceFrameworkEnum]
|
|
99
|
+
],
|
|
100
|
+
required_resources: List[Union[str, ResourceNameTemplate]] = None,
|
|
101
|
+
default_load_params: Optional[Dict[str, Any]] = None,
|
|
102
|
+
required_cpu: Optional[float] = None,
|
|
103
|
+
required_memory: Optional[int] = None,
|
|
104
|
+
required_gu: Optional[int] = None,
|
|
105
|
+
required_gpu_memory: Optional[int] = None,
|
|
106
|
+
device: str = None,
|
|
107
|
+
properties: Optional[Dict[str, Any]] = None,
|
|
108
|
+
tags: Optional[List[str]] = None,
|
|
109
|
+
):
|
|
110
|
+
frameworks_to_register = (
|
|
111
|
+
[inference_frameworks]
|
|
112
|
+
if isinstance(inference_frameworks, (str, InferenceFrameworkEnum))
|
|
113
|
+
else inference_frameworks
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
deployment_configs = []
|
|
117
|
+
for inference_framework in frameworks_to_register:
|
|
118
|
+
inference_framework = (
|
|
119
|
+
InferenceFrameworkEnum.from_string(inference_framework)
|
|
120
|
+
if isinstance(inference_framework, str)
|
|
121
|
+
else inference_framework
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
model_config = ModelDeploymentConfig(
|
|
125
|
+
model_name=model_name,
|
|
126
|
+
model_file=model_file,
|
|
127
|
+
inference_framework_type=inference_framework,
|
|
128
|
+
required_resource_files=required_resources,
|
|
129
|
+
load_params=default_load_params,
|
|
130
|
+
required_cpu=required_cpu,
|
|
131
|
+
required_memory=required_memory,
|
|
132
|
+
required_gu=required_gu,
|
|
133
|
+
required_gpu_memory=required_gpu_memory,
|
|
134
|
+
device=device,
|
|
135
|
+
properties=properties,
|
|
136
|
+
tags=tags,
|
|
137
|
+
)
|
|
138
|
+
deployment_configs.append(model_config)
|
|
139
|
+
return deployment_configs
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def register_model_deployments(
|
|
143
|
+
model_name: str,
|
|
144
|
+
model_file: str,
|
|
145
|
+
inference_frameworks: Union[
|
|
146
|
+
str, InferenceFrameworkEnum, List[InferenceFrameworkEnum]
|
|
147
|
+
],
|
|
148
|
+
required_resources: List[Union[str, ResourceNameTemplate]] = None,
|
|
149
|
+
default_load_params: Optional[Dict[str, Any]] = None,
|
|
150
|
+
required_cpu: Optional[float] = None,
|
|
151
|
+
required_memory: Optional[int] = None,
|
|
152
|
+
required_gu: Optional[int] = None,
|
|
153
|
+
required_gpu_memory: Optional[int] = None,
|
|
154
|
+
device: str = None,
|
|
155
|
+
properties: Optional[Dict[str, Any]] = None,
|
|
156
|
+
tags: Optional[List[str]] = None,
|
|
157
|
+
):
|
|
158
|
+
"""
|
|
159
|
+
Register model deployments
|
|
160
|
+
|
|
161
|
+
Notes
|
|
162
|
+
-----
|
|
163
|
+
- Alpha version for model deployments, all fields could be changed in the future.
|
|
164
|
+
"""
|
|
165
|
+
model_name = model_name.lower()
|
|
166
|
+
if not isinstance(inference_frameworks, (InferenceFrameworkEnum, List, str)):
|
|
167
|
+
raise TypeError(
|
|
168
|
+
f"inference_framework_type must be type InferenceFrameworkEnum or List[InferenceFrameworkEnum] but {type(inference_frameworks)}"
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
model_deployments = create_model_deployments(
|
|
172
|
+
model_name=model_name,
|
|
173
|
+
model_file=model_file,
|
|
174
|
+
inference_frameworks=inference_frameworks,
|
|
175
|
+
required_resources=required_resources,
|
|
176
|
+
default_load_params=default_load_params,
|
|
177
|
+
required_cpu=required_cpu,
|
|
178
|
+
required_memory=required_memory,
|
|
179
|
+
required_gu=required_gu,
|
|
180
|
+
required_gpu_memory=required_gpu_memory,
|
|
181
|
+
device=device,
|
|
182
|
+
properties=properties,
|
|
183
|
+
tags=tags,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
for deployment in model_deployments:
|
|
187
|
+
if model_name not in _registered_llm_models:
|
|
188
|
+
_registered_llm_models[model_name] = {}
|
|
189
|
+
if deployment.device not in _registered_llm_models[model_name]:
|
|
190
|
+
_registered_llm_models[model_name][deployment.device] = {}
|
|
191
|
+
|
|
192
|
+
existing = _registered_llm_models[model_name][deployment.device].get(
|
|
193
|
+
deployment.inference_framework_type
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if existing:
|
|
197
|
+
raise ValueError(
|
|
198
|
+
f"Model {model_name} with {deployment.inference_framework_type} on {deployment.device} already registered"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
_registered_llm_models[model_name][deployment.device][
|
|
202
|
+
deployment.inference_framework_type
|
|
203
|
+
] = deployment
|
|
204
|
+
|
|
205
|
+
return model_deployments
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def get_registered_model_config(
|
|
209
|
+
model_name: str,
|
|
210
|
+
expected_device: Optional[str] = None,
|
|
211
|
+
expected_inference_framework: Optional[InferenceFrameworkEnum] = None,
|
|
212
|
+
) -> Optional[ModelDeploymentConfig]:
|
|
213
|
+
model_name = model_name.lower()
|
|
214
|
+
|
|
215
|
+
def _load_model_framework_config(framework_configs, expected_framework):
|
|
216
|
+
if expected_framework is not None:
|
|
217
|
+
return framework_configs[expected_framework]
|
|
218
|
+
else:
|
|
219
|
+
model_config = next(iter(framework_configs.values()))
|
|
220
|
+
return model_config
|
|
221
|
+
|
|
222
|
+
try:
|
|
223
|
+
if expected_device is not None:
|
|
224
|
+
model_framework_configs = _registered_llm_models[model_name][
|
|
225
|
+
expected_device
|
|
226
|
+
]
|
|
227
|
+
return _load_model_framework_config(
|
|
228
|
+
model_framework_configs, expected_inference_framework
|
|
229
|
+
)
|
|
230
|
+
else:
|
|
231
|
+
model_all_configs = _registered_llm_models[model_name]
|
|
232
|
+
for device, model_framework_configs in model_all_configs.items():
|
|
233
|
+
model_config = _load_model_framework_config(
|
|
234
|
+
model_framework_configs, expected_inference_framework
|
|
235
|
+
)
|
|
236
|
+
if model_config:
|
|
237
|
+
return model_config
|
|
238
|
+
except KeyError:
|
|
239
|
+
pass
|
|
240
|
+
except StopIteration:
|
|
241
|
+
pass
|
|
242
|
+
|
|
243
|
+
return None
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def clean_registered_model():
|
|
247
|
+
_registered_llm_models.clear()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from enum import Enum
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InferenceFrameworkEnum(Enum):
|
|
19
|
+
LLAMA_CPP_PYTHON_TEXT = "LLAMA_CPP_PYTHON:TEXT"
|
|
20
|
+
LLAMA_CPP_SERVE_TEXT = "LLAMA_CPP_SERVE:TEXT"
|
|
21
|
+
DASH_SCOPE_TEXT = "DASH_SCOPE:TEXT"
|
|
22
|
+
DASH_SCOPE_MULTIMODAL = "DASH_SCOPE:MULTIMODAL"
|
|
23
|
+
VLLM_SERVE_TEXT = "VLLM_SERVE:TEXT"
|
|
24
|
+
OPENAI_REMOTE_TEXT = "OPENAI_REMOTE:TEXT"
|
|
25
|
+
OTHER = "OTHER"
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def from_string(cls, label):
|
|
29
|
+
if label is None:
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
if isinstance(label, cls):
|
|
33
|
+
return label
|
|
34
|
+
|
|
35
|
+
return cls(label)
|