# Dependency Components (Utils)
Relies on SDKs, which are used to organize modules and SDKs that are frequently reused throughout the framework and to aggregate them based on functional relevance.
## Overview
1. Parameter sdk (scepter.modules.utils.config)
2. Path sdk (scepter.modules.utils.directory)
3. PyTorch distributed sdk (scepter.modules.utils.distribute)
4. Model export sdk (scepter.modules.utils.export_model)
5. File system sdk (scepter.modules.utils.file_system)
6. Logging sdk (scepter.modules.utils.logger)
7. Video processing sdk (scepter.modules.utils.video_reader), see the document (video_reader.md)
8. Module registration sdk (scepter.modules.utils.registry)
9. Data sdk (scepter.modules.utils.data)
10. Model sdk (scepter.modules.utils.model)
11. Sampler sdk (scepter.modules.utils.sampler)
12. Probing sdk (scepter.modules.utils.probe)
## 1. Parameter sdk (scepter.modules.utils.config)
### Basic Usage
```python
from scepter.modules.utils.config import Config
# Initialize Config object from a dict
fs_cfg = Config(load=False, cfg_dict={"NAME": "LocalFs"})
print(fs_cfg.NAME)
# Initialize Config object from a json file
import json
json.dump({"NAME": "LocalFs"}, open("examples.json", "w"))
fs_cfg = Config(load=True, cfg_file="examples.json")
print(fs_cfg.NAME)
# Initialize Config object from a yaml file
import yaml
yaml.dump({"NAME": "LocalFs"}, open("examples.yaml", "w"))
fs_cfg = Config(load=True, cfg_file="examples.yaml")
print(fs_cfg.NAME)
# Initialize Config object from an argparse object, in this mode cfg parameters are required, otherwise an error will be thrown.
import argparse
parser = argparse.ArgumentParser(
description="Argparser for Cate process:\n"
)
parser.add_argument(
"--stage",
dest="stage",
help="Running stage!",
default="train"
)
fs_cfg = Config(load=True, parser_ins=parser)
print(fs_cfg.args)
```
### function **__init__**
(cfg_dict: dict = {}, load = True, cfg_file = None, logger = None, parser_ins: argparse.ArgumentParser = None)
**Parameters**
- **cfg_dict** — A dict containing parameters, default is {}.
- **load** — When True, it indicates parameters need to be loaded from a file or argparse.
- **cfg_file** — Supports loading parameters from json or yaml files.
- **logger** — Logging instance, if None, a default logging instance to stdio will be initialized.
- **parser_ins** — An argparse instance, default includes cfg parameter for passing in a parameter file.
-- parser_ins will by default include the following system parameters:
- cfg(--cfg) used to specify the parameter file location
- local_rank(--local_rank) the default parameter read by torchrun, default is 0, can be ignored
- launcher(-l) the method for starting the code, default is spawn, alternative is torchrun
- data_online(-d) set global data not to be persisted to disk, should be set on pai clusters
- share_storage(-s) set whether global data download is on a shared file system, like nas. When set, it implies the file system is shared across nodes, and only needs downloading at rank=0; when not set, it means data is downloaded on different nodes, and should only be downloaded when device_id=0.
### function **dict_to_yaml**
(module_name: str, name: str, json_config: dict, set_name: bool = False)
**Parameters**
- **module_name** — The module name, used at the start of the template to explain which module's template it is.
- **name** — The default name for the Name field.
- **json_config** — Parameter description, needs to satisfy {} (indicating dependency on a sub-module), [] (dependency on multiple sub-modules), {"value":"", "description":""} (leaf parameter value).
- **set_name** — Whether to set the Name field.
**Returns**
- **str** — Template text
## 2. Path sdk (scepter.modules.utils.directory)
Some commonly used path functions
### Basic Usage
```python
from scepter.modules.utils.directory import osp_path
# Automatically join paths based on the path prefix
prefix = "xxxx"
data_file = "example_videos/1.mp4"
# Outputs as xxxx/example_videos/1.mp4
print(osp_path(prefix, data_file))
# Also outputs as xxxx/example_videos/1.mp4
data_file = "xxxx/example_videos/1.mp4"
print(osp_path(prefix, data_file))
from scepter.modules.utils.directory import get_relative_folder
# Get the folder path at a specified level according to the path
# By default, the last level xxxx/example_videos/
print(get_relative_folder(data_file))
# The second last level xxxx/
print(get_relative_folder(data_file, keep_index=-2))
from scepter.modules.utils.directory import get_md5
# Get the md5 code of the text/path 34a447fb46d0b786a3999c9dad01d470
print(get_md5(data_file))
```
### function **osp_path**
( prefix: str, data_file: str ) -> str
Automatically join paths based on the path prefix
**Parameters**
- **prefix** —— Path prefix.
- **data_file** —— File path.
**Returns**
- **str** —— Joined path after concatenation
### function **get_relative_folder**
( abs_path: str, keep_index: int = -1 ) -> str
Get the folder path at a specified level according to the path
**Parameters**
- **abs_path** —— File path.
- **keep_index** —— Level to keep, -1 for the last level, -2 for the second last level.
**Returns**
- **str** —— Parsed path after resolution
### function **get_md5**
( ori_str: str) -> str
Get the md5 code based on a string/path
**Parameters**
- **ori_str** —— File path or string.
**Returns**
- **str** —— md5 code
## 3. PyTorch Distributed(scepter.modules.utils.distribute)
PyTorch distributed initialization SDK. By using this SDK, users can avoid focusing on the implementation details of PyTorch's distributed initialization.
### Basic Usage
```python
from scepter.modules.utils.distribute import we
from scepter.modules.utils.config import Config
cfg = Config(cfg_dict={}, load=False)
def fn():
pass
print(we)
# Launch task
we.init_env(cfg, fn, logger=None)
```
### class **Workenv**
This is a class used to uniformly manage the running environment. It is usually not necessary to initialize this class. In scepter.modules.utils.distribute,
a global instance, 'we', will be initialized to manage some key flag variables.
- Specific explanations of some parameters of we are as follows:
- initialized marks whether the PyTorch process group has been initialized, default is False.
- is_distributed marks whether it is currently running in distributed mode, default is False.
- sync_bn marks whether to use sync_bn, default is False.
- rank marks the current process's rank, default is 0.
- world_size marks the total number of processes, default is 1.
- device_id marks the current device ID being used, default is 0.
- device_count marks the total number of devices in the current environment, default is 1.
- use_pl marks whether the pytorch_lighting engine is used in the current environment, default is False.
- launcher marks the method of starting the environment, default is spawn.
- data_online marks whether the io part of the data in the current environment is persisted to disk, default is False.
- share_storage marks whether different nodes in the current environment use the same file system, such as nas, default is False.
### function **we.init_env**
( config: scepter.modules.utils.config.Config, fn: function, logger: logging.Logger = None )
As the entry point for executing any task.
**Parameters**
- **config** —— The passed instance of parameters.
- **fn** —— The function that needs to be executed.
- **logger** —— A standard logging instance.
### function **we.get_env**
() -> dict
Retrieve all class-internal parameters of we, stored in the form of a dict.
### function **we.set_env**
(we_env: dict)
Reset all class-internal parameters of we, using a dict as input.
**Parameters**
- **we_env** —— A dict, each key represents an internal class variable.
### function **get_dist_info**
() -> int, int
Obtain the environment's rank/world size, which is directly acquired through torch's methods, typically used when the environment is not initialized with we.init_env.
**Returns**
- **rank** —— The rank of the current process, default is 0.
- **world_size** —— The total number of processes in the current environment, when in single-process mode it is 1.
### function **gather_data**
(data: [list, dict, tensor, object] ) -> data
Using scepter.distributed.all_gather to collect any instance, and merge it into a summarized instance on rank=0 process.
**Parameters**
- **data** —— Supports dict/list, where elements can be any instance or tensor.
**Returns**
- **data** —— A summarized data with the same structure as the input data.
### function **gather_list**
(data: [list] ) -> data
Using scepter.distributed.all_gather to collect any list instance, and merge it into a summarized instance on rank=0 process.
**Parameters**
- **data** —— Supports list, where elements can be any instance or tensor.
**Returns**
- **data** —— A summarized data with the same structure as the input data.
### function **gather_picklable**
(data: [object] ) -> data
Using scepter.distributed.all_gather to collect any picklable instance, and merge it into a summarized instance on rank=0 process.
**Parameters**
- **data** —— A serializable instance.
**Returns**
- **data** —— A summarized data with the same structure as the input data.
### function **broadcast**
(tensor: **torch.Tensor**, src: **str**, group: **list** )
An optimized version of torch.distributed.broadcast, automatically checks if it is a distributed environment.
**Parameters**
- **tensor** —— The tensor to be broadcast.
- **src** —— The source device for broadcasting.
- **group** —— The group for broadcasting.
**Returns**
- **data** —— A summarized data with the same structure as the input data.
* Other functions such as barrier, all_reduce, reduce, send, recv, isend, irecv, scatter have also been adapted for this operation.
### function **gather_gpu_tensors**
(tensor: torch.Tensor ) -> tensor: torch.Tensor
Using torch.distributed.all_gather to collect GPU tensors, and merge then transfer them to the CPU on rank=0.
Since cloning is involved, this may cause additional GPU memory waste.
**Parameters**
- **tensor** —— The GPU tensor input.
**Returns**
- **tensor** —— The output tensor on the CPU for process rank=0.
## 4. 模型导出sdk(scepter.modules.utils.export_model)
APIs for exporting models to TorchScript/ONNX formats.
### Basic Usage
```python
from scepter.modules.utils.export_model import save_develop_model_multi_io
save_develop_model_multi_io(
model,
input_size,
input_type,
input_name,
output_name,
limit,
save_onnx_path=None,
save_pt_path=None
)
```
### function **save_develop_model_multi_io**
(model: torch.nn.Module, input_size: list, input_type: list, input_name: list,
output_name: list, limit: list, save_onnx_path: str = None, save_pt_path: str = None) -> pt_module, onnx_module
Supports importing and exporting models with multiple inputs and outputs
**Parameters**
- **model** —— The model instance to be exported.
- **input_size** —— A list where each tuple contains the shape information of the data, such as [[1, 3, 224, 224]].
- **input_type** —— A list where each tuple contains the type information of the data, corresponding to input_size, with possible values ("float32", "float16", "int8", "int16", "int32", "int64"). For example, ["float32"].
- **input_name** —— A list used to name each input variable for ONNX, such as ["image"], corresponding to the above input_size and input_type.
- **output_name** —— A list used to name each output variable for ONNX, such as ["output"]
- **limit** —— A list where each tuple defines the upper and lower bounds for that input, such as [[-1, 1]], representing that the input tensor for the image is between -1 and 1.
- **save_onnx_path** —— If not None, the ONNX model will be exported and stored at this location.
- **save_pt_path** —— If not None, the TorchScript model will be exported and stored at this location.
**Returns**
- **tensor** —— The output tensor on the CPU for process rank=0.
## 5. 文件系统sdk(scepter.modules.utils.file_system)
Refer to [file_clients](file_clients.md)
## 6. Logging SDK(scepter.modules.utils.logger)
Used to instantiate a standard logging instance for printing information.
### Basic Usage
```python
from scepter.modules.utils.logger import get_logger, init_logger
std_logger = get_logger(name="scepter")
init_logger(std_logger, log_file="", dist_launcher="pytorch")
```
### function **get_logger**
(name: str) -> logger
Retrieve a logging instance.
**Parameters**
- **name** —— The log prefix; it will be printed first every time the logger prints.
**Returns**
- **logger** —— Returns a logging instance.
### function **init_logger**
(in_logger: logger, log_file: str) -> logger
Re-initialize a logging instance, which can assign a file for output storage.
**Parameters**
- **in_logger** —— The existing logging instance.
- **log_file** —— The desired file location for storage.
- **dist_launcher** —— No longer important, deprecated
### function **as_time**
(s: int) -> str
Convert time in seconds s to the standard format of xxx days xxx hours xxx mins xxx secs
**Parameters**
- **s** —— Represents the number of seconds s.
**Returns**
- **str** —— Formatted output.
### function **time_since**
(since: int, percent: float) -> str
Calculate the time remaining until completion based on the current usage time and percentage.
**Parameters**
- **since** —— Represents the current elapsed time.
- **percent** —— Represents the percentage of completion.
**Returns**
- **str** —— Formatted output.
## 7. Video Processing SDK (scepter.modules.utils.video_reader)
APIs for handling video reading.
### Basic Usage
```python
from scepter.modules.utils.video_reader.frame_sampler import do_frame_sample
from scepter.modules.utils.video_reader.video_reader import (
VideoReaderWrapper, EasyVideoReader, FramesReaderWrapper
)
```
### function **do_frame_sample**
(sampling_type: str, vid_len: int, vid_fps: int, num_frames: int, kwargs) -> list
Get a frame sampler for videos.
**Parameters**
- **sampling_type** —— The type of sampler, currently supports UniformSampler (uniform sampler), IntervalSampler (interval sampler), SegmentSampler (segment sampler).
- **vid_len** —— Video length.
- **vid_fps** —— Frame rate of the video.
- **num_frames** —— Number of frames in the video.
- **kwargs** —— Required parameters for the corresponding sampler, refer to the source code of the corresponding sampler.
**Returns**
- **list** —— Sampled frames result.
### class **VideoReaderWrapper**
A standard class for reading videos, with the underlying decoder being decord.
#### function **VideoReaderWrapper.__init__**
(video_path: str)
Initialize a video instance.
**Parameters**
- **video_path** —— Video link.
#### function **VideoReaderWrapper.len**
() -> int
Get the total number of video frames.
**Returns**
- **int** —— Number of video frames.
#### function **VideoReaderWrapper.fps**
() -> float
Get video frame rate.
**Returns**
- **float** —— Video frame rate.
#### function **VideoReaderWrapper.duration**
() -> float
Get video duration.
**Returns**
- **float** —— Video duration.
#### function **VideoReaderWrapper.sample_frames**
(decode_list: torch.Tensor) -> torch.Tensor
Tensor Get frame data based on frame numbers.
**Parameters**
- **decode_list** —— List of sampled frame numbers.
**Returns**
- **tensor** —— Data tensor.
### class **FramesReaderWrapper**
Reads frame data in order from a given fully decoded frame folder.
#### function **FramesReaderWrapper.__init__**
(frame_dir: str, extract_fps: float, suffix: str)
Initialize a video instance.
**Parameters**
- **frame_dir** —— The frame folder.
- **extract_fps** —— FPS for extracting frames.
- **suffix** —— Suffix for the frame files, default is jpg.
#### function **FramesReaderWrapper.len**
() -> int
Get the total number of video frames.
**Returns**
- **int** —— Number of video frames.
#### function **FramesReaderWrapper.fps**
() -> float
Get video frame rate.
**Returns**
- **float** —— Video frame rate.
#### function **FramesReaderWrapper.duration**
() -> float
Get video duration.
**Returns**
- **float** —— Video duration.
#### function **FramesReaderWrapper.sample_frames**
(decode_list: torch.Tensor) -> torch.Tensor
Get frame data based on frame numbers.
**Parameters**
- **decode_list** —— List of sampled frame numbers.
**Returns**
- **tensor** —— Data tensor.
### class **EasyVideoReader**
Used for reading, sampling, and preprocessing long videos.
#### function **EasyVideoReader.__init__**
(video_path: str, num_frames: int, clip_duration: Union[float, Fraction, str],
overlap: Union[float, Fraction, str] = Fraction(0), transforms: Optional[Callable] = None)
Initialize a video instance.
**Parameters**
- **video_path** —— Video link.
- **num_frames** —— Number of video frames.
- **clip_duration** —— Length of each clip.
- **overlap** —— Proportion of overlap between clips.
- **transforms** —— Preprocessing operators.
#### function **EasyVideoReader.__iter__**
() -> int
Iterator
#### function **EasyVideoReader.__next__**
() -> float
Iterator, with each iteration returning a tensor of a segment.
**Returns**
- **tensor** —— The tensor of the video segment.
## 8. Module Registration SDK (scepter.modules.utils.registry)
Used for managing various registered classes.
### Basic Usage
```python
from scepter.modules.utils.registry import Registry
from scepter.modules.utils.config import Config
MODELS = Registry('MODELS')
@MODELS.register_class()
class ResNet(object):
pass
config = Config(load=False, cfg_dict={"NAME": "ResNet"})
resnet = MODELS.build(config)
```
### class **Registry**
Registry
#### function **Registry.__init__**
(name: str, build_func: function = None, common_para: Config = None, allow_types: tuple = ("class", "function"))
Initialize the registry module instance
**Parameters**
- **name** —— Module name.
- **build_func** —— The function called when building the module.
- **common_para** —— Common parameters under this module.
- **allow_types** —— The types of classes or functions allowed to be registered in this module, by default, registration of both is allowed.
#### function **Registry.build**
(cfg: Config, logger: logger = None, kwargs) -> cls_obj
Build an instance of the target class
**Returns**
- **cls_obj** —— An instance of a specific class.
#### function **Registry.register_class**
(name: str)
Register a class
**Returns**
- **name** —— Registration name.
#### function **Registry.register_function**
(name: str)
Register a function
**Returns**
- **name** —— Registration name.
## 9. Data SDK(scepter.modules.utils.data)
Used for transferring data between devices
### Basic Usage
```python
import torch
from scepter.modules.utils.data import transfer_data_to_numpy, transfer_data_to_cpu, transfer_data_to_cuda
data = {"a": torch.Tensor([0])}
transfer_data_to_numpy(data)
transfer_data_to_cpu(data)
transfer_data_to_cuda(data)
```
#### function **transfer_data_to_numpy**
(data: list/dict of torch.Tensor) -> (data: list/dict of numpy.ndarray)
Transfer data to numpy
**Parameters**
- **data** —— Stored as a list/dict of torch.Tensor.
**Returns**
- **data** —— Stored as a list/dict of numpy.ndarray, consistent with the input format.
#### function **transfer_data_to_cpu**
(data: list/dict of torch.Tensor(cuda)) -> (data: list/dict of torch.Tensor(cpu))
Transfer data from GPU to CPU
**Parameters**
- **data** —— Stored as a list/dict of torch.Tensor[CUDA].
**Returns**
- **data** —— Stored as a list/dict of torch.Tensor[CPU], consistent with the input format.
#### function **transfer_data_to_cuda**
(data: list/dict of torch.Tensor(cpu)) -> (data: list/dict of torch.Tensor(cuda))
Transfer data from CPU to GPU
**Parameters**
- **data** —— Stored as a list/dict of torch.Tensor[CPU].
**Returns**
- **data** —— Stored as a list/dict of torch.Tensor[CUDA], consistent with the input format.
## 10. Model SDK(torch.utils.model)
Used for operations such as loading and evaluating models
### Basic Usage
```python
import torch
from scepter.modules.utils.model import move_model_to_cpu, load_pretrained,
count_params, init_weights
```
#### function **move_model_to_cpu**
(params: list/dict of torch.Tensor[cuda]) -> (data: torch.Tensor[cpu])
Move parameter data from GPU to CPU.
**Parameters**
- **params** —— Stored as OrderedDict of torch.Tensor[cuda].
**Returns**
- **params** —— Stored as torch.Tensor[cpu], consistent with the input format.
#### function **load_pretrained**
(model: torch.nn.Module, path: str, map_location="cpu", logger=None,
sub_level=None)
Load parameters into the model.
**Parameters**
- **model** —— The torch.nn.Module model instance.
- **path** —— Pretrained model parameters.
- **map_location** —— cpu/cuda。
- **logger** —— Standard logging instance.
- **sub_level** —— For example, when using DDP, sub-level indexing might be needed.
#### function **count_params**
(model: torch.nn.Module) -> (float)
Count the total parameters of the model.
**Parameters**
- **model** —— The torch.nn.Module model instance.
**Returns**
- **float** —— The quantity of model parameters (number of floating-point values).
#### function **init_weights**
(model: torch.nn.Module)
Initialize the parameters of the model modules.
**Parameters**
- **module** —— The torch.nn.Module model instance.
## 11. Sampler SDK(scepter.modules.utils.sampler)
Samplers are quite universal, and in most cases, custom development is not required. Here are provided several common types of sampler.
### Basic Usage
```python
import torch
from scepter.modules.utils.sampler import MultiFoldDistributedSampler,
EvalDistributedSampler, MultiLevelBatchSampler, MixtureOfSamplers
```
#### class **MultiFoldDistributedSampler**
Multi-fold sampler, supports repeating multiple rounds of data within one epoch.
#### function **MultiFoldDistributedSampler.__init__**
( dataset: torch.data.dataset, num_folds=1, num_replicas=None, rank=None, shuffle=True)
**Parameters**
- **dataset** —— An instance of torch.data.dataset class.
- **num_folds** —— Int, indicates the number of times the data is repeated.
- **num_replicas** —— Indicates the number of data partitions, usually consistent with world-size.
- **rank** —— Indicates the current process number.
- **shuffle** —— Whether to shuffle the data.
#### function **MultiFoldDistributedSampler.__iter__**
()
Iterator, each iteration returns an index of a sample.
#### function **MultiFoldDistributedSampler.set_epoch**
(epoch: int)
Set the current epoch.
**Parameters**
- **epoch** —— The current epoch.
#### class **EvalDistributedSampler**
A sampler for testing, when not using padding mode, it will be observed that the last rank has fewer data than other ranks.
#### function **EvalDistributedSampler.__init__**
( dataset: torch.data.dataset, num_replicas: Optional[int] =None, rank: Optional[int] =None, padding: bool =False)
**Parameters**
- **dataset** —— An instance of torch.data.dataset class.
- **num_replicas** —— Indicates the number of data partitions, usually consistent with world-size.
- **rank** —— Rank indicates the current process number.
- **padding** —— Whether the data needs to be padded, if padded it can ensure the last rank has the same amount of data as the other ranks.
#### function **EvalDistributedSampler.__iter__**
()
Iterator, each iteration returns an index of a sample.
#### function **EvalDistributedSampler.set_epoch**
(epoch: int)
Set the current epoch.
**Parameters**
- **epoch** —— The current epoch.
#### class **MultiLevelBatchSampler**
A sampler for multi-level indexing of large-scale data.
#### function **MultiLevelBatchSampler.__init__**
(index_file: str, batch_size: int, rank: int =0, seed: int = 8888)
**Parameters**
- **index_file** —— Index file for multi-level data indexing.
- **batch_size** —— The size of a batch.
- **rank** —— Rank indicates the current process number.
- **seed** —— Random sampling seed, obtained globally from data.registry.
#### function **MultiLevelBatchSampler.__iter__**
()
Iterator, each iteration returns an index of a sample.
#### class **MixtureOfSamplers**
A sampler for multi-level indexing of large-scale data.
#### function **MixtureOfSamplers.__init__**
(samplers: list(sampler), probabilities: list(float), rank: int =0, seed: int = 8888)
**Parameters**
- **samplers** —— A list of samplers used for mixing.
- **probabilities** —— The probability of each sampler.
- **rank** —— Rank indicates the current process number.
- **seed** —— Random sampling seed, obtained globally from data.registry.
#### function **MixtureOfSamplers.__iter__**
()
Iterator, each iteration returns an index of a sample.
## 12. Prober SDK(scepter.modules.utils.probe)
Used for probing variable statistics of various components.
### Basic Usage
```python
import numpy as np
from scepter.modules.model.base_model import BaseModel
from scepter.modules.utils.config import Config
from scepter.modules.utils.file_system import FS
from scepter.modules.utils.probe import ProbeData
class TestModel(BaseModel):
def forward(self, data):
self.register_probe(data)
# Test ProbeData example + view_distribute
self.register_probe(
{"data_key_dist": ProbeData(data["data_key"], view_distribute=True),
"data_folder": ProbeData(data["data_folder"], view_distribute=True)}
)
class TestModel2(BaseModel):
def __init__(self, cfg, logger=None):
super().__init__(cfg, logger=logger)
self.test_model = TestModel(cfg, logger=logger)
def forward(self, data):
# Test list of str done
# Test dict of str done
# Test dict of number done
# Test list of number done
# Test number done
# Test str done
# Test np.array done
# Test list of np.ndarray must manually create ProbeData done
# Test 2D image must manually create ProbeData
# Test 3D image must manually create ProbeData
# Test 3D multiple 2D images must manually create ProbeData
# Test 3D list image must manually create ProbeData
# Test 4D Array image done
# Test 4D Array image save_html
# Test 4D List image save_html
self.register_probe(data)
self.register_probe({
"test_np_list": ProbeData([np.zeros([40, 40, 3]).astype(dtype=np.int8) for _ in range(5)]),
"test_2d_img": ProbeData(np.zeros([40, 40]).astype(dtype=np.uint8), is_image=True),
"test_3d_n2d_img": ProbeData(np.zeros([10, 40, 40]).astype(dtype=np.uint8), is_image=True),
"test_3d_img": ProbeData(np.zeros([40, 40, 3]).astype(dtype=np.uint8), is_image=True),
"test_list_3d_img": ProbeData([np.zeros([40, 40, 3]).astype(dtype=np.uint8) for _ in range(5)],
is_image=True),
"test_4d_img": ProbeData(np.zeros([10, 40, 40, 3]).astype(dtype=np.uint8), is_image=True),
"test_4d_img_html": ProbeData(np.zeros([10, 40, 40, 3]).astype(dtype=np.uint8), is_image=True,
build_html=True, build_label="4d_data"),
"test_4d_img_list_html": ProbeData([np.zeros([10, 40, 40, 3]).astype(dtype=np.uint8) for _ in range(5)],
is_image=True,
build_html=True, build_label=[f"4d_data_{i}" for i in range(5)]),
})
# Test nested types
self.test_model(data)
cfg = Config(cfg_file="./config/general_config.yaml")
if cfg.have("FILE_SYSTEMS"):
for file_sys in cfg.FILE_SYSTEMS:
fs_prefix = FS.init_fs_client(file_sys)
else:
fs_prefix = FS.init_fs_client(cfg)
_model = TestModel2(cfg)
data = {
"data_key": [1, 1],
"data_folder": {"mj": 1., "mj_square": 2.},
"timestamp": 1,
"valid_str": "right",
"test_np": np.zeros([40, 40, 3]).astype(dtype=np.int8)
}
_model(data)
probe = _model.probe_data()
for key in probe:
print(key, probe[key].to_log(prefix=f"xxx/{key}"))
```
Use in conjunction with Hooks as follows (where PROB_INTERVAL is the probe storage interval, i.e., the number of calls to probe_data()):
```yaml
-
NAME: ProbeDataHook
PROB_INTERVAL: 100
```
#### class **ProbeData**
Instance of probe data.
#### function **ProbeData.__init__**
(data, is_image = False, build_html = False, build_label = None, view_distribute = False)
**Parameters**
- **data** —— The probe data passed in, currently supports str, Number, list, dict, tensor.
- **is_image** —— Whether to store as an image.
- **build_html** —— Whether to store as html.
- **build_label** —— The label for saving html.
- **view_distribute** —— To count the frequency of some values.