easy-cs-rec-custommodel 0.8.6__py2.py3-none-any.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 easy-cs-rec-custommodel might be problematic. Click here for more details.
- easy_cs_rec_custommodel-0.8.6.dist-info/LICENSE +203 -0
- easy_cs_rec_custommodel-0.8.6.dist-info/METADATA +48 -0
- easy_cs_rec_custommodel-0.8.6.dist-info/RECORD +336 -0
- easy_cs_rec_custommodel-0.8.6.dist-info/WHEEL +6 -0
- easy_cs_rec_custommodel-0.8.6.dist-info/top_level.txt +2 -0
- easy_rec/__init__.py +114 -0
- easy_rec/python/__init__.py +0 -0
- easy_rec/python/builders/__init__.py +0 -0
- easy_rec/python/builders/hyperparams_builder.py +78 -0
- easy_rec/python/builders/loss_builder.py +333 -0
- easy_rec/python/builders/optimizer_builder.py +211 -0
- easy_rec/python/builders/strategy_builder.py +44 -0
- easy_rec/python/compat/__init__.py +0 -0
- easy_rec/python/compat/adam_s.py +245 -0
- easy_rec/python/compat/array_ops.py +229 -0
- easy_rec/python/compat/dynamic_variable.py +542 -0
- easy_rec/python/compat/early_stopping.py +653 -0
- easy_rec/python/compat/embedding_ops.py +162 -0
- easy_rec/python/compat/embedding_parallel_saver.py +316 -0
- easy_rec/python/compat/estimator_train.py +116 -0
- easy_rec/python/compat/exporter.py +473 -0
- easy_rec/python/compat/feature_column/__init__.py +0 -0
- easy_rec/python/compat/feature_column/feature_column.py +3675 -0
- easy_rec/python/compat/feature_column/feature_column_v2.py +5233 -0
- easy_rec/python/compat/feature_column/sequence_feature_column.py +648 -0
- easy_rec/python/compat/feature_column/utils.py +154 -0
- easy_rec/python/compat/layers.py +329 -0
- easy_rec/python/compat/ops.py +14 -0
- easy_rec/python/compat/optimizers.py +619 -0
- easy_rec/python/compat/queues.py +311 -0
- easy_rec/python/compat/regularizers.py +208 -0
- easy_rec/python/compat/sok_optimizer.py +440 -0
- easy_rec/python/compat/sync_replicas_optimizer.py +528 -0
- easy_rec/python/compat/weight_decay_optimizers.py +475 -0
- easy_rec/python/core/__init__.py +0 -0
- easy_rec/python/core/easyrec_metrics/__init__.py +24 -0
- easy_rec/python/core/easyrec_metrics/distribute_metrics_impl_pai.py +3702 -0
- easy_rec/python/core/easyrec_metrics/distribute_metrics_impl_tf.py +3768 -0
- easy_rec/python/core/learning_schedules.py +228 -0
- easy_rec/python/core/metrics.py +402 -0
- easy_rec/python/core/sampler.py +844 -0
- easy_rec/python/eval.py +102 -0
- easy_rec/python/export.py +150 -0
- easy_rec/python/feature_column/__init__.py +0 -0
- easy_rec/python/feature_column/feature_column.py +664 -0
- easy_rec/python/feature_column/feature_group.py +89 -0
- easy_rec/python/hpo/__init__.py +0 -0
- easy_rec/python/hpo/emr_hpo.py +140 -0
- easy_rec/python/hpo/generate_hpo_sql.py +71 -0
- easy_rec/python/hpo/pai_hpo.py +297 -0
- easy_rec/python/inference/__init__.py +0 -0
- easy_rec/python/inference/csv_predictor.py +189 -0
- easy_rec/python/inference/hive_parquet_predictor.py +200 -0
- easy_rec/python/inference/hive_predictor.py +166 -0
- easy_rec/python/inference/odps_predictor.py +70 -0
- easy_rec/python/inference/parquet_predictor.py +147 -0
- easy_rec/python/inference/parquet_predictor_v2.py +147 -0
- easy_rec/python/inference/predictor.py +621 -0
- easy_rec/python/inference/processor/__init__.py +0 -0
- easy_rec/python/inference/processor/test.py +170 -0
- easy_rec/python/inference/vector_retrieve.py +124 -0
- easy_rec/python/input/__init__.py +0 -0
- easy_rec/python/input/batch_tfrecord_input.py +117 -0
- easy_rec/python/input/criteo_binary_reader.py +259 -0
- easy_rec/python/input/criteo_input.py +107 -0
- easy_rec/python/input/csv_input.py +175 -0
- easy_rec/python/input/csv_input_ex.py +72 -0
- easy_rec/python/input/csv_input_v2.py +68 -0
- easy_rec/python/input/datahub_input.py +320 -0
- easy_rec/python/input/dummy_input.py +58 -0
- easy_rec/python/input/hive_input.py +123 -0
- easy_rec/python/input/hive_parquet_input.py +140 -0
- easy_rec/python/input/hive_rtp_input.py +174 -0
- easy_rec/python/input/input.py +1064 -0
- easy_rec/python/input/kafka_dataset.py +144 -0
- easy_rec/python/input/kafka_input.py +235 -0
- easy_rec/python/input/load_parquet.py +317 -0
- easy_rec/python/input/odps_input.py +101 -0
- easy_rec/python/input/odps_input_v2.py +110 -0
- easy_rec/python/input/odps_input_v3.py +132 -0
- easy_rec/python/input/odps_rtp_input.py +187 -0
- easy_rec/python/input/odps_rtp_input_v2.py +104 -0
- easy_rec/python/input/parquet_input.py +397 -0
- easy_rec/python/input/parquet_input_v2.py +180 -0
- easy_rec/python/input/parquet_input_v3.py +203 -0
- easy_rec/python/input/rtp_input.py +225 -0
- easy_rec/python/input/rtp_input_v2.py +145 -0
- easy_rec/python/input/tfrecord_input.py +100 -0
- easy_rec/python/layers/__init__.py +0 -0
- easy_rec/python/layers/backbone.py +571 -0
- easy_rec/python/layers/capsule_layer.py +176 -0
- easy_rec/python/layers/cmbf.py +390 -0
- easy_rec/python/layers/common_layers.py +192 -0
- easy_rec/python/layers/dnn.py +87 -0
- easy_rec/python/layers/embed_input_layer.py +25 -0
- easy_rec/python/layers/fm.py +26 -0
- easy_rec/python/layers/input_layer.py +396 -0
- easy_rec/python/layers/keras/__init__.py +34 -0
- easy_rec/python/layers/keras/activation.py +114 -0
- easy_rec/python/layers/keras/attention.py +267 -0
- easy_rec/python/layers/keras/auxiliary_loss.py +47 -0
- easy_rec/python/layers/keras/blocks.py +262 -0
- easy_rec/python/layers/keras/bst.py +119 -0
- easy_rec/python/layers/keras/custom_ops.py +250 -0
- easy_rec/python/layers/keras/data_augment.py +133 -0
- easy_rec/python/layers/keras/din.py +67 -0
- easy_rec/python/layers/keras/einsum_dense.py +598 -0
- easy_rec/python/layers/keras/embedding.py +81 -0
- easy_rec/python/layers/keras/fibinet.py +251 -0
- easy_rec/python/layers/keras/interaction.py +416 -0
- easy_rec/python/layers/keras/layer_norm.py +364 -0
- easy_rec/python/layers/keras/mask_net.py +166 -0
- easy_rec/python/layers/keras/multi_head_attention.py +717 -0
- easy_rec/python/layers/keras/multi_task.py +125 -0
- easy_rec/python/layers/keras/numerical_embedding.py +376 -0
- easy_rec/python/layers/keras/ppnet.py +194 -0
- easy_rec/python/layers/keras/transformer.py +192 -0
- easy_rec/python/layers/layer_norm.py +51 -0
- easy_rec/python/layers/mmoe.py +83 -0
- easy_rec/python/layers/multihead_attention.py +162 -0
- easy_rec/python/layers/multihead_cross_attention.py +749 -0
- easy_rec/python/layers/senet.py +73 -0
- easy_rec/python/layers/seq_input_layer.py +134 -0
- easy_rec/python/layers/sequence_feature_layer.py +249 -0
- easy_rec/python/layers/uniter.py +301 -0
- easy_rec/python/layers/utils.py +248 -0
- easy_rec/python/layers/variational_dropout_layer.py +130 -0
- easy_rec/python/loss/__init__.py +0 -0
- easy_rec/python/loss/circle_loss.py +82 -0
- easy_rec/python/loss/contrastive_loss.py +79 -0
- easy_rec/python/loss/f1_reweight_loss.py +38 -0
- easy_rec/python/loss/focal_loss.py +93 -0
- easy_rec/python/loss/jrc_loss.py +128 -0
- easy_rec/python/loss/listwise_loss.py +161 -0
- easy_rec/python/loss/multi_similarity.py +68 -0
- easy_rec/python/loss/pairwise_loss.py +307 -0
- easy_rec/python/loss/softmax_loss_with_negative_mining.py +110 -0
- easy_rec/python/loss/zero_inflated_lognormal.py +76 -0
- easy_rec/python/main.py +878 -0
- easy_rec/python/model/__init__.py +0 -0
- easy_rec/python/model/autoint.py +73 -0
- easy_rec/python/model/cmbf.py +47 -0
- easy_rec/python/model/collaborative_metric_learning.py +182 -0
- easy_rec/python/model/custom_model.py +323 -0
- easy_rec/python/model/dat.py +138 -0
- easy_rec/python/model/dbmtl.py +116 -0
- easy_rec/python/model/dcn.py +70 -0
- easy_rec/python/model/deepfm.py +106 -0
- easy_rec/python/model/dlrm.py +73 -0
- easy_rec/python/model/dropoutnet.py +207 -0
- easy_rec/python/model/dssm.py +154 -0
- easy_rec/python/model/dssm_senet.py +143 -0
- easy_rec/python/model/dummy_model.py +48 -0
- easy_rec/python/model/easy_rec_estimator.py +739 -0
- easy_rec/python/model/easy_rec_model.py +467 -0
- easy_rec/python/model/esmm.py +242 -0
- easy_rec/python/model/fm.py +63 -0
- easy_rec/python/model/match_model.py +357 -0
- easy_rec/python/model/mind.py +445 -0
- easy_rec/python/model/mmoe.py +70 -0
- easy_rec/python/model/multi_task_model.py +303 -0
- easy_rec/python/model/multi_tower.py +62 -0
- easy_rec/python/model/multi_tower_bst.py +190 -0
- easy_rec/python/model/multi_tower_din.py +130 -0
- easy_rec/python/model/multi_tower_recall.py +68 -0
- easy_rec/python/model/pdn.py +203 -0
- easy_rec/python/model/ple.py +120 -0
- easy_rec/python/model/rank_model.py +485 -0
- easy_rec/python/model/rocket_launching.py +203 -0
- easy_rec/python/model/simple_multi_task.py +54 -0
- easy_rec/python/model/uniter.py +46 -0
- easy_rec/python/model/wide_and_deep.py +121 -0
- easy_rec/python/ops/1.12/incr_record.so +0 -0
- easy_rec/python/ops/1.12/kafka.so +0 -0
- easy_rec/python/ops/1.12/libcustom_ops.so +0 -0
- easy_rec/python/ops/1.12/libembed_op.so +0 -0
- easy_rec/python/ops/1.12/libhiredis.so.1.0.0 +0 -0
- easy_rec/python/ops/1.12/librdkafka++.so.1 +0 -0
- easy_rec/python/ops/1.12/librdkafka.so.1 +0 -0
- easy_rec/python/ops/1.12/libredis++.so +0 -0
- easy_rec/python/ops/1.12/libredis++.so.1 +0 -0
- easy_rec/python/ops/1.12/libredis++.so.1.2.3 +0 -0
- easy_rec/python/ops/1.12/libstr_avx_op.so +0 -0
- easy_rec/python/ops/1.12/libwrite_sparse_kv.so +0 -0
- easy_rec/python/ops/1.15/incr_record.so +0 -0
- easy_rec/python/ops/1.15/kafka.so +0 -0
- easy_rec/python/ops/1.15/libcustom_ops.so +0 -0
- easy_rec/python/ops/1.15/libembed_op.so +0 -0
- easy_rec/python/ops/1.15/libhiredis.so.1.0.0 +0 -0
- easy_rec/python/ops/1.15/librdkafka++.so +0 -0
- easy_rec/python/ops/1.15/librdkafka++.so.1 +0 -0
- easy_rec/python/ops/1.15/librdkafka.so +0 -0
- easy_rec/python/ops/1.15/librdkafka.so.1 +0 -0
- easy_rec/python/ops/1.15/libredis++.so.1 +0 -0
- easy_rec/python/ops/1.15/libstr_avx_op.so +0 -0
- easy_rec/python/ops/2.12/libcustom_ops.so +0 -0
- easy_rec/python/ops/2.12/libload_embed.so +0 -0
- easy_rec/python/ops/2.12/libstr_avx_op.so +0 -0
- easy_rec/python/ops/__init__.py +0 -0
- easy_rec/python/ops/gen_kafka_ops.py +193 -0
- easy_rec/python/ops/gen_str_avx_op.py +28 -0
- easy_rec/python/ops/incr_record.py +30 -0
- easy_rec/python/predict.py +170 -0
- easy_rec/python/protos/__init__.py +0 -0
- easy_rec/python/protos/autoint_pb2.py +122 -0
- easy_rec/python/protos/backbone_pb2.py +1416 -0
- easy_rec/python/protos/cmbf_pb2.py +435 -0
- easy_rec/python/protos/collaborative_metric_learning_pb2.py +252 -0
- easy_rec/python/protos/custom_model_pb2.py +57 -0
- easy_rec/python/protos/dat_pb2.py +262 -0
- easy_rec/python/protos/data_source_pb2.py +422 -0
- easy_rec/python/protos/dataset_pb2.py +1920 -0
- easy_rec/python/protos/dbmtl_pb2.py +191 -0
- easy_rec/python/protos/dcn_pb2.py +197 -0
- easy_rec/python/protos/deepfm_pb2.py +163 -0
- easy_rec/python/protos/dlrm_pb2.py +163 -0
- easy_rec/python/protos/dnn_pb2.py +329 -0
- easy_rec/python/protos/dropoutnet_pb2.py +239 -0
- easy_rec/python/protos/dssm_pb2.py +262 -0
- easy_rec/python/protos/dssm_senet_pb2.py +282 -0
- easy_rec/python/protos/easy_rec_model_pb2.py +1672 -0
- easy_rec/python/protos/esmm_pb2.py +133 -0
- easy_rec/python/protos/eval_pb2.py +930 -0
- easy_rec/python/protos/export_pb2.py +379 -0
- easy_rec/python/protos/feature_config_pb2.py +1359 -0
- easy_rec/python/protos/fm_pb2.py +90 -0
- easy_rec/python/protos/hive_config_pb2.py +138 -0
- easy_rec/python/protos/hyperparams_pb2.py +624 -0
- easy_rec/python/protos/keras_layer_pb2.py +692 -0
- easy_rec/python/protos/layer_pb2.py +1936 -0
- easy_rec/python/protos/loss_pb2.py +1713 -0
- easy_rec/python/protos/mind_pb2.py +497 -0
- easy_rec/python/protos/mmoe_pb2.py +215 -0
- easy_rec/python/protos/multi_tower_pb2.py +295 -0
- easy_rec/python/protos/multi_tower_recall_pb2.py +198 -0
- easy_rec/python/protos/optimizer_pb2.py +2017 -0
- easy_rec/python/protos/pdn_pb2.py +293 -0
- easy_rec/python/protos/pipeline_pb2.py +516 -0
- easy_rec/python/protos/ple_pb2.py +231 -0
- easy_rec/python/protos/predict_pb2.py +1140 -0
- easy_rec/python/protos/rocket_launching_pb2.py +169 -0
- easy_rec/python/protos/seq_encoder_pb2.py +1084 -0
- easy_rec/python/protos/simi_pb2.py +54 -0
- easy_rec/python/protos/simple_multi_task_pb2.py +97 -0
- easy_rec/python/protos/tf_predict_pb2.py +630 -0
- easy_rec/python/protos/tower_pb2.py +661 -0
- easy_rec/python/protos/train_pb2.py +1197 -0
- easy_rec/python/protos/uniter_pb2.py +307 -0
- easy_rec/python/protos/variational_dropout_pb2.py +91 -0
- easy_rec/python/protos/wide_and_deep_pb2.py +131 -0
- easy_rec/python/test/__init__.py +0 -0
- easy_rec/python/test/csv_input_test.py +340 -0
- easy_rec/python/test/custom_early_stop_func.py +19 -0
- easy_rec/python/test/dh_local_run.py +104 -0
- easy_rec/python/test/embed_test.py +155 -0
- easy_rec/python/test/emr_run.py +119 -0
- easy_rec/python/test/eval_metric_test.py +107 -0
- easy_rec/python/test/excel_convert_test.py +64 -0
- easy_rec/python/test/export_test.py +513 -0
- easy_rec/python/test/fg_test.py +70 -0
- easy_rec/python/test/hive_input_test.py +311 -0
- easy_rec/python/test/hpo_test.py +235 -0
- easy_rec/python/test/kafka_test.py +373 -0
- easy_rec/python/test/local_incr_test.py +122 -0
- easy_rec/python/test/loss_test.py +110 -0
- easy_rec/python/test/odps_command.py +61 -0
- easy_rec/python/test/odps_local_run.py +86 -0
- easy_rec/python/test/odps_run.py +254 -0
- easy_rec/python/test/odps_test_cls.py +39 -0
- easy_rec/python/test/odps_test_prepare.py +198 -0
- easy_rec/python/test/odps_test_util.py +237 -0
- easy_rec/python/test/pre_check_test.py +54 -0
- easy_rec/python/test/predictor_test.py +394 -0
- easy_rec/python/test/rtp_convert_test.py +133 -0
- easy_rec/python/test/run.py +138 -0
- easy_rec/python/test/train_eval_test.py +1299 -0
- easy_rec/python/test/util_test.py +85 -0
- easy_rec/python/test/zero_inflated_lognormal_test.py +53 -0
- easy_rec/python/tools/__init__.py +0 -0
- easy_rec/python/tools/add_boundaries_to_config.py +67 -0
- easy_rec/python/tools/add_feature_info_to_config.py +145 -0
- easy_rec/python/tools/convert_config_format.py +48 -0
- easy_rec/python/tools/convert_rtp_data.py +79 -0
- easy_rec/python/tools/convert_rtp_fg.py +106 -0
- easy_rec/python/tools/create_config_from_excel.py +427 -0
- easy_rec/python/tools/criteo/__init__.py +0 -0
- easy_rec/python/tools/criteo/convert_data.py +157 -0
- easy_rec/python/tools/edit_lookup_graph.py +134 -0
- easy_rec/python/tools/faiss_index_pai.py +116 -0
- easy_rec/python/tools/feature_selection.py +316 -0
- easy_rec/python/tools/hit_rate_ds.py +223 -0
- easy_rec/python/tools/hit_rate_pai.py +138 -0
- easy_rec/python/tools/pre_check.py +120 -0
- easy_rec/python/tools/predict_and_chk.py +111 -0
- easy_rec/python/tools/read_kafka.py +55 -0
- easy_rec/python/tools/split_model_pai.py +286 -0
- easy_rec/python/tools/split_pdn_model_pai.py +272 -0
- easy_rec/python/tools/test_saved_model.py +80 -0
- easy_rec/python/tools/view_saved_model.py +39 -0
- easy_rec/python/tools/write_kafka.py +65 -0
- easy_rec/python/train_eval.py +325 -0
- easy_rec/python/utils/__init__.py +15 -0
- easy_rec/python/utils/activation.py +120 -0
- easy_rec/python/utils/check_utils.py +87 -0
- easy_rec/python/utils/compat.py +14 -0
- easy_rec/python/utils/config_util.py +652 -0
- easy_rec/python/utils/constant.py +43 -0
- easy_rec/python/utils/convert_rtp_fg.py +616 -0
- easy_rec/python/utils/dag.py +192 -0
- easy_rec/python/utils/distribution_utils.py +268 -0
- easy_rec/python/utils/ds_util.py +65 -0
- easy_rec/python/utils/embedding_utils.py +73 -0
- easy_rec/python/utils/estimator_utils.py +1036 -0
- easy_rec/python/utils/export_big_model.py +630 -0
- easy_rec/python/utils/expr_util.py +118 -0
- easy_rec/python/utils/fg_util.py +53 -0
- easy_rec/python/utils/hit_rate_utils.py +220 -0
- easy_rec/python/utils/hive_utils.py +183 -0
- easy_rec/python/utils/hpo_util.py +137 -0
- easy_rec/python/utils/hvd_utils.py +56 -0
- easy_rec/python/utils/input_utils.py +108 -0
- easy_rec/python/utils/io_util.py +282 -0
- easy_rec/python/utils/load_class.py +249 -0
- easy_rec/python/utils/meta_graph_editor.py +941 -0
- easy_rec/python/utils/multi_optimizer.py +62 -0
- easy_rec/python/utils/numpy_utils.py +18 -0
- easy_rec/python/utils/odps_util.py +79 -0
- easy_rec/python/utils/pai_util.py +86 -0
- easy_rec/python/utils/proto_util.py +90 -0
- easy_rec/python/utils/restore_filter.py +89 -0
- easy_rec/python/utils/shape_utils.py +432 -0
- easy_rec/python/utils/static_shape.py +71 -0
- easy_rec/python/utils/test_utils.py +866 -0
- easy_rec/python/utils/tf_utils.py +56 -0
- easy_rec/version.py +4 -0
- test/__init__.py +0 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# -*- encoding:utf-8 -*-
|
|
2
|
+
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
3
|
+
"""Load_class.py tools for loading classes."""
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
import logging
|
|
7
|
+
import os
|
|
8
|
+
import pkgutil
|
|
9
|
+
import pydoc
|
|
10
|
+
import traceback
|
|
11
|
+
from abc import ABCMeta
|
|
12
|
+
|
|
13
|
+
import six
|
|
14
|
+
import tensorflow as tf
|
|
15
|
+
|
|
16
|
+
import easy_rec
|
|
17
|
+
from easy_rec.python.utils import compat
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def python_file_to_module(python_file):
|
|
21
|
+
mod = python_file.strip('/').replace('/', '.')
|
|
22
|
+
if mod.endswith('.py'):
|
|
23
|
+
mod = mod[:-3]
|
|
24
|
+
return mod
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def load_by_path(path):
|
|
28
|
+
"""Load functions or modules or classes.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
path: path to modules or functions or classes,
|
|
32
|
+
such as: tf.nn.relu
|
|
33
|
+
|
|
34
|
+
Return:
|
|
35
|
+
modules or functions or classes
|
|
36
|
+
"""
|
|
37
|
+
path = path.strip()
|
|
38
|
+
if path == '' or path is None:
|
|
39
|
+
return None
|
|
40
|
+
if 'lambda' in path:
|
|
41
|
+
return eval(path)
|
|
42
|
+
components = path.split('.')
|
|
43
|
+
if components[0] == 'tf':
|
|
44
|
+
components[0] = 'tensorflow'
|
|
45
|
+
path = '.'.join(components)
|
|
46
|
+
try:
|
|
47
|
+
return pydoc.locate(path)
|
|
48
|
+
except pydoc.ErrorDuringImport:
|
|
49
|
+
logging.error('load %s failed: %s' % (path, traceback.format_exc()))
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _get_methods(aClass):
|
|
54
|
+
|
|
55
|
+
def should_track(func_name):
|
|
56
|
+
return func_name == '__init__' or func_name[0] != '_'
|
|
57
|
+
|
|
58
|
+
names = sorted(dir(aClass), key=str.lower)
|
|
59
|
+
attrs = [(n, getattr(aClass, n)) for n in names if should_track(n)]
|
|
60
|
+
# in python3 , unbound class method is function while is
|
|
61
|
+
# method in python2
|
|
62
|
+
if compat.in_python3():
|
|
63
|
+
return dict((n, a) for n, a in attrs if inspect.isfunction(a))
|
|
64
|
+
else:
|
|
65
|
+
return dict((n, a) for n, a in attrs if inspect.ismethod(a))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _get_method_declare(aMethod):
|
|
69
|
+
try:
|
|
70
|
+
name = aMethod.__name__
|
|
71
|
+
if compat.in_python3():
|
|
72
|
+
sig_str = str(inspect.signature(aMethod))
|
|
73
|
+
return sig_str
|
|
74
|
+
else:
|
|
75
|
+
spec = inspect.getargspec(aMethod)
|
|
76
|
+
args = inspect.formatargspec(spec.args, spec.varargs, spec.keywords,
|
|
77
|
+
spec.defaults)
|
|
78
|
+
return '%s%s' % (name, args)
|
|
79
|
+
except TypeError:
|
|
80
|
+
return '%s(cls, ...)' % name
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def check_class(cls, impl_cls, function_names=None):
|
|
84
|
+
"""Check implemented class is valid according to template class.
|
|
85
|
+
|
|
86
|
+
if function signature is not the same, exception will be raised.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
cls: class which declares functions that need users to implement
|
|
90
|
+
impl_cls: user implemented class
|
|
91
|
+
function_names: if not None, will only check these funtions and their signature
|
|
92
|
+
"""
|
|
93
|
+
missing = {}
|
|
94
|
+
|
|
95
|
+
ours = _get_methods(cls)
|
|
96
|
+
theirs = _get_methods(impl_cls)
|
|
97
|
+
|
|
98
|
+
for name, method in six.iteritems(ours):
|
|
99
|
+
if function_names is not None and name not in function_names:
|
|
100
|
+
continue
|
|
101
|
+
if name not in theirs:
|
|
102
|
+
missing[name + '()'] = 'not implemented'
|
|
103
|
+
continue
|
|
104
|
+
ourf = _get_method_declare(method)
|
|
105
|
+
theirf = _get_method_declare(theirs[name])
|
|
106
|
+
|
|
107
|
+
if not (ourf == theirf):
|
|
108
|
+
missing[name + '()'] = 'method signature differs'
|
|
109
|
+
|
|
110
|
+
if len(missing) > 0:
|
|
111
|
+
raise Exception('incompatible Implementation-implementation %s: %s' %
|
|
112
|
+
(impl_cls.__class__.__name__, missing))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def import_pkg(pkg_info, prefix_to_remove=None):
|
|
116
|
+
"""Import package.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
pkg_info: pkgutil.ModuleInfo object
|
|
120
|
+
prefix_to_remove: the package prefix to be removed
|
|
121
|
+
"""
|
|
122
|
+
package_path = pkg_info[0].path
|
|
123
|
+
if prefix_to_remove is not None:
|
|
124
|
+
package_path = package_path.replace(prefix_to_remove, '')
|
|
125
|
+
mod_name = pkg_info[1]
|
|
126
|
+
|
|
127
|
+
if package_path.startswith('/'):
|
|
128
|
+
# absolute path file, we should use relative import
|
|
129
|
+
mod = pkg_info[0].find_module(mod_name)
|
|
130
|
+
if mod is not None:
|
|
131
|
+
# skip those test files in easyrec
|
|
132
|
+
if not mod_name.endswith('_test'):
|
|
133
|
+
mod.load_module(pkg_info[1])
|
|
134
|
+
else:
|
|
135
|
+
raise Exception('import module %s failed' % (package_path + mod_name))
|
|
136
|
+
else:
|
|
137
|
+
# use similar import methods as the import keyword
|
|
138
|
+
module_path = os.path.join(package_path, mod_name).replace('/', '.')
|
|
139
|
+
# skip those test files
|
|
140
|
+
if not mod_name.endswith('_test'):
|
|
141
|
+
try:
|
|
142
|
+
__import__(module_path)
|
|
143
|
+
except Exception as e:
|
|
144
|
+
import traceback
|
|
145
|
+
logging.error(traceback.format_exc())
|
|
146
|
+
raise ValueError('import module %s failed: %s' % (module_path, str(e)))
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def auto_import(user_path=None):
|
|
150
|
+
"""Auto import python files so that register_xxx decorator will take effect.
|
|
151
|
+
|
|
152
|
+
By default, we will import files in pre-defined directory and import all
|
|
153
|
+
files recursively in user_dir
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
user_path: directory or file that store user-defined python code, by default we wiil only
|
|
157
|
+
search file in current directory
|
|
158
|
+
"""
|
|
159
|
+
# True False indicates import recursively or not
|
|
160
|
+
pre_defined_dirs = [
|
|
161
|
+
('easy_rec/python/model', False),
|
|
162
|
+
('easy_rec/python/input', False),
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
parent_dir = easy_rec.parent_dir
|
|
166
|
+
prefix_to_remove = None
|
|
167
|
+
# dealing with easy-rec in sited-packages, remove parent directory prefix
|
|
168
|
+
# to make class name starts with easy_rec
|
|
169
|
+
if parent_dir != '':
|
|
170
|
+
for idx in range(len(pre_defined_dirs)):
|
|
171
|
+
pre_defined_dirs[idx] = (os.path.join(parent_dir,
|
|
172
|
+
pre_defined_dirs[idx][0]),
|
|
173
|
+
pre_defined_dirs[idx][1])
|
|
174
|
+
prefix_to_remove = parent_dir + '/'
|
|
175
|
+
|
|
176
|
+
if user_path is not None:
|
|
177
|
+
if tf.gfile.IsDirectory(user_path):
|
|
178
|
+
user_dir = user_path
|
|
179
|
+
else:
|
|
180
|
+
user_dir, _ = os.path.split(user_path)
|
|
181
|
+
pre_defined_dirs.append((user_dir, True))
|
|
182
|
+
|
|
183
|
+
for dir_path, recursive_import in pre_defined_dirs:
|
|
184
|
+
for pkg_info in pkgutil.iter_modules([dir_path]):
|
|
185
|
+
import_pkg(pkg_info, prefix_to_remove)
|
|
186
|
+
|
|
187
|
+
if recursive_import:
|
|
188
|
+
for root, dirs, files in os.walk(dir_path):
|
|
189
|
+
for subdir in dirs:
|
|
190
|
+
dirname = os.path.join(root, subdir)
|
|
191
|
+
for pkg_info in pkgutil.iter_modules([dirname]):
|
|
192
|
+
import_pkg(pkg_info, prefix_to_remove)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def register_class(class_map, class_name, cls):
|
|
196
|
+
assert class_name not in class_map or class_map[class_name] == cls, \
|
|
197
|
+
'confilict class %s , %s is already register to be %s' % (
|
|
198
|
+
cls, class_name, str(class_map[class_name]))
|
|
199
|
+
logging.debug('register class %s' % class_name)
|
|
200
|
+
class_map[class_name] = cls
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def get_register_class_meta(class_map, have_abstract_class=True):
|
|
204
|
+
|
|
205
|
+
class RegisterABCMeta(ABCMeta):
|
|
206
|
+
|
|
207
|
+
def __new__(mcs, name, bases, attrs):
|
|
208
|
+
newclass = super(RegisterABCMeta, mcs).__new__(mcs, name, bases, attrs)
|
|
209
|
+
register_class(class_map, name, newclass)
|
|
210
|
+
|
|
211
|
+
@classmethod
|
|
212
|
+
def create_class(cls, name):
|
|
213
|
+
if name in class_map:
|
|
214
|
+
return class_map[name]
|
|
215
|
+
else:
|
|
216
|
+
raise Exception('Class %s is not registered. Available ones are %s' %
|
|
217
|
+
(name, list(class_map.keys())))
|
|
218
|
+
|
|
219
|
+
setattr(newclass, 'create_class', create_class)
|
|
220
|
+
return newclass
|
|
221
|
+
|
|
222
|
+
return RegisterABCMeta
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def load_keras_layer(name):
|
|
226
|
+
"""Load keras layer class.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
name: keras layer name
|
|
230
|
+
|
|
231
|
+
Return:
|
|
232
|
+
(layer_class, is_customize)
|
|
233
|
+
"""
|
|
234
|
+
name = name.strip()
|
|
235
|
+
if name == '' or name is None:
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
path = 'easy_rec.python.layers.keras.' + name
|
|
239
|
+
try:
|
|
240
|
+
cls = pydoc.locate(path)
|
|
241
|
+
if cls is not None:
|
|
242
|
+
return cls, True
|
|
243
|
+
path = 'tensorflow.keras.layers.' + name
|
|
244
|
+
return pydoc.locate(path), False
|
|
245
|
+
except pydoc.ErrorDuringImport:
|
|
246
|
+
print('load keras layer %s failed' % name)
|
|
247
|
+
logging.error('load keras layer %s failed: %s' %
|
|
248
|
+
(name, traceback.format_exc()))
|
|
249
|
+
return None, False
|