提交 c47f48ef 编写于 作者: M Megvii Engine Team

docs(api/lite): add lite global.h and pylite utils.py doc

GitOrigin-RevId: a7dfcf8914819e8dcea5585be61178cd56eea80f
上级 5821c0b6
...@@ -10,65 +10,97 @@ ...@@ -10,65 +10,97 @@
namespace lite { namespace lite {
/** /**
* \brief Model decryption function * @brief Model decryption function
* *
* \param[in] const void* is the decrypted model memory pointer * @param arg1 the to be decrypted model memory pointer
* \param[in] size_t the size the decrypted model memory in byte * @param arg2 the byte size of the decrypted model memory
* \param[in] const std::vector<uint8_t>& the decryption key vector * @param arg3 the decryption key in vector
* @return the decrypted model in vector format, it's length and content can get by
* the operators of vector
*/ */
using DecryptionFunc = std::function<std::vector<uint8_t>( using DecryptionFunc = std::function<std::vector<uint8_t>(
const void*, size_t, const std::vector<uint8_t>&)>; const void*, size_t, const std::vector<uint8_t>&)>;
/** /**
* \brief register a custom decryption method and key to lite. * @brief register a custom decryption method and key to lite
* *
* \param[in] decrypt_name the name of the decryption, which will act as the * @param decrypt_name the name of the decryption, which will act as the
* hash key to find the decryption method. * hash key to find the decryption method
* *
* \param[in] func the decryption function, which will decrypt the model with * @param func the decryption function, which will decrypt the model with
* the registered key, return a vector that contain the decrypted model. * the registered key, return a vector that contain the decrypted model
* *
* \param[in] key the decryption key of the method * @param key the decryption key of the method
*
* @return Whether or not the decryption method register successful
*/ */
LITE_API bool register_decryption_and_key( LITE_API bool register_decryption_and_key(
std::string decrypt_name, const DecryptionFunc& func, std::string decrypt_name, const DecryptionFunc& func,
const std::vector<uint8_t>& key); const std::vector<uint8_t>& key);
/** /**
* \brief update decryption function or key of a custom decryption method. * @brief update decryption function or key of a custom decryption method, in
* lite the decryption function and the key store in pair, user can change one of which
* by this function
* *
* \param[in] decrypt_name the name of the decryption, which will act as the * @param decrypt_name the name of the decryption, which will act as the
* hash key to find the decryption method. * hash key to find the decryption method
* *
* \param[in] func the decryption function, which will decrypt the model with * @param func the decryption function, which will decrypt the model with
* the registered key, return a vector that contain the decrypted model. if * the registered key, return a vector that contain the decrypted model. if
* function is nullptr, it will not be updated. * the function is nullptr, it will not be updated
*
* @param key the decryption key of the method, if the size of key is zero,
* the key will not be updated
* *
* \param[in] key the decryption key of the method, if the size of key is zero, * @return Whether or not the decryption method update successful
* it will not be updated
*/ */
LITE_API bool update_decryption_or_key( LITE_API bool update_decryption_or_key(
std::string decrypt_name, const DecryptionFunc& func, std::string decrypt_name, const DecryptionFunc& func,
const std::vector<uint8_t>& key); const std::vector<uint8_t>& key);
/** /**
* \brief Model information parse function * @brief Model information parse function, MegEngine Lite model may pack some
* * information with the model to configure the model inference processing conveniently,
* \param[in] const void* is the information memory * this function is used to parse the information packed with model, and store
* \param[in] size_t the size the information memory * the parsed result into the params
* \param[in] const std::string the model name used for check whether the *
* infomation match the model * @param arg1 the information memory pointer
* \param[in] Config the model config, ParseInfoFunc can fill it with the * @param arg2 the size the information memory
* information in json, the config will influence Network loading later * @param arg3 the model name used for check whether the name in the information
* \param[in] NetworkIO the model IO, ParseInfoFunc can fill it with the * @param arg4 the model configuration, ParseInfoFunc fill it with the
* information in json, the networkio will influence Network forwarding later * parsed information, the configuration will influence Network inference later
* \param[in] std::unordered_map<std::string, LiteAny>& isolated_config_map, the *
* other config not inclue in config and networkIO, ParseInfoFunc can fill it * @param arg5 the model IO information, ParseInfoFunc fill it with the parsed
* with the information in json, now support: * information, the networkio will influence Network inference later
* "device_id" : int, default 0 *
* "number_threads" : uint32_t, default 1 * @param arg6 the other configurations do not include in configuration and networkIO,
* "is_inplace_model" : bool, default false * ParseInfoFunc fill it with the parsed information pair, now support:
* "use_tensorrt" : bool, default false *
* \verbatim
* embed:rst:leading-asterisk
* .. list-table::
* :widths: 20 10 30
* :header-rows: 1
*
* * - name
* - type
* - default
* * - "device_id"
* - int
* - 0
* * - "number_threads"
* - uint32_t
* - 1
* * - "is_inplace_model"
* - bool
* - false
* * - "use_tensorrt"
* - bool
* - false
* \endverbatim
*
* @return Whether or not the parse function parse successfully
*/ */
using ParseInfoFunc = std::function<bool( using ParseInfoFunc = std::function<bool(
const void*, size_t, const std::string model_name, Config& config, const void*, size_t, const std::string model_name, Config& config,
...@@ -77,89 +109,122 @@ using ParseInfoFunc = std::function<bool( ...@@ -77,89 +109,122 @@ using ParseInfoFunc = std::function<bool(
std::string& extra_info)>; std::string& extra_info)>;
/** /**
* \brief register a custom parser function to lite. * @brief register a custom parser function to lite
* *
* \param[in] info_type the name of the parser function, which will act as the * @param info_type the name of the parser function, which will act as the
* hash key to find the parser method. * hash key to find the parser method.
* *
* \param[in] parse_func the parser function, which will parse the given * @param parse_func the parser function, which will parse the given
* information and modify the Network Config and IO. * information and modify the Network configuration and IO information.
* *
* @return Whether or not the parse function register successful
*/ */
LITE_API bool register_parse_info_func( LITE_API bool register_parse_info_func(
std::string info_type, const ParseInfoFunc& parse_func); std::string info_type, const ParseInfoFunc& parse_func);
/*! \brief Get version /** @brief get megengint lite version
*
* @param major the major version of megengine lite
* @param minor the minor version of megengine lite
* @param patch the patch version of megengine lite
*/ */
LITE_API void get_version(int& major, int& minor, int& patch); LITE_API void get_version(int& major, int& minor, int& patch);
/*! \brief Set the current log level. /**
* \param[in] level The new log level * @brief set the current log level
* @param level the new log level to be set
*/ */
LITE_API void set_log_level(LiteLogLevel level); LITE_API void set_log_level(LiteLogLevel level);
/*! \brief Get the current log level. /** @brief get the current log level
* \return The current log level * @return the current log level
*/ */
LITE_API LiteLogLevel get_log_level(); LITE_API LiteLogLevel get_log_level();
/*! \brief Get device count /** @brief get the number of device of the given device type in current context
* \param[in] device_type device type * @param device_type the to be count device type
* \return the device count * @return the number of device
*/ */
LITE_API size_t get_device_count(LiteDeviceType device_type); LITE_API size_t get_device_count(LiteDeviceType device_type);
/*! \brief try to coalesce all free memory in megenine /** @brief try to coalesce all free memory in megenine, when call it MegEnine Lite
* will try to free all the unused memory thus decrease the runtime memory usage
*/ */
LITE_API void try_coalesce_all_free_memory(); LITE_API void try_coalesce_all_free_memory();
/*! /**
* \brief Set the loader to the lite * @brief set the loader path to be used in lite
* \param loader_path is the file path which store the cache * @param loader_path the file path which store the loader library
*/ */
LITE_API void set_loader_lib_path(const std::string& loader_path); LITE_API void set_loader_lib_path(const std::string& loader_path);
/*! /**
* \brief Set the algo policy cache file for CPU/CUDA ... * @brief Set the algo policy cache file for CPU/CUDA, the algo policy cache is
* \param cache_path is the file path which store the cache * produced by megengine fast-run
* \param always_sync sync the cache when model run *
* @param cache_path the file path which store the cache
* @param always_sync always update the cache file when model run
*/ */
LITE_API void set_persistent_cache( LITE_API void set_persistent_cache(
const std::string& cache_path, bool always_sync = false); const std::string& cache_path, bool always_sync = false);
/*! /**
* \brief dump the PersistentCache policy cache to file, if the network is set * @brief dump the PersistentCache policy cache to the specific file, if the network is
* to profile when forward, though this the algo policy will dump to file * set to profile when forward, though this the algo policy will dump to file
*
* @param cache_path the cache file path to be dump
*/ */
LITE_API void dump_persistent_cache(const std::string& cache_path); LITE_API void dump_persistent_cache(const std::string& cache_path);
/*! /**
* \brief Set the TensorRT engine cache path for serialized prebuilt ICudaEngine * @brief set the TensorRT engine cache path for serialized prebuilt ICudaEngine
*
* @param cache_path the cache file path to set
*/ */
LITE_API void set_tensor_rt_cache(std::string tensorrt_cache_path); LITE_API void set_tensor_rt_cache(std::string tensorrt_cache_path);
/*! /**
* \brief dump the TensorRT cache to the file set in set_tensor_rt_cache * @brief dump the TensorRT cache to the file set in set_tensor_rt_cache
*/ */
LITE_API void dump_tensor_rt_cache(); LITE_API void dump_tensor_rt_cache();
/** /**
* register the physical and virtual address pair to the mge, some device * @brief register the physical and virtual address pair to the mge, some device
* need the map from physical to virtual. * need the map from physical to virtual
*
* @param vir_ptr - the virtual ptr to set to megenine
* @param phy_ptr - the physical ptr to set to megenine
* @param device - the device to set the pair memory
* @param backend - the backend to set the pair memory
*
* @return Whether the register is successful
*/ */
LITE_API bool register_memory_pair( LITE_API bool register_memory_pair(
void* vir_ptr, void* phy_ptr, size_t length, LiteDeviceType device, void* vir_ptr, void* phy_ptr, size_t length, LiteDeviceType device,
LiteBackend backend = LiteBackend::LITE_DEFAULT); LiteBackend backend = LiteBackend::LITE_DEFAULT);
/** /**
* clear the physical and virtual address pair in mge. * @brief clear the physical and virtual address pair in mge
*
* @param vir_ptr - the virtual ptr to set to megenine
* @param phy_ptr - the physical ptr to set to megenine
* @param device - the device to set the pair memory
* @param backend - the backend to set the pair memory
*
* @return Whether the clear is successful
*/ */
LITE_API bool clear_memory_pair( LITE_API bool clear_memory_pair(
void* vir_ptr, void* phy_ptr, LiteDeviceType device, void* vir_ptr, void* phy_ptr, LiteDeviceType device,
LiteBackend backend = LiteBackend::LITE_DEFAULT); LiteBackend backend = LiteBackend::LITE_DEFAULT);
/** /**
* get the physic address by the virtual address in mge. * @brief get the physic address by the virtual address in mge.
*
* @param vir_ptr - the virtual ptr to set to megenine
* @param device - the device to set the pair memory
* @param backend - the backend to set the pair memory
*
* @return The physic address to lookup
*/ */
void* lookup_physic_ptr(void* vir_ptr, LiteDeviceType device, LiteBackend backend); void* lookup_physic_ptr(void* vir_ptr, LiteDeviceType device, LiteBackend backend);
......
...@@ -11,7 +11,53 @@ from .tensor import * ...@@ -11,7 +11,53 @@ from .tensor import *
class TensorBatchCollector: class TensorBatchCollector:
""" """
this is a tensor utils to collect subtensor in batch continuous A tensor utils is used to collect many single batch tensor to a multi batch
size tensor, when the multi batch size tensor collect finish, the result
tensor can be get and send to the model input for forwarding.
when collect single batch tensor, the single batch tensor is no need in the
same device_type and device_id with the result tensor, however the dtype must
match and the shape must match except the highest dimension.
Args:
shape: the multi batch size tensor shape, After collection, the result
tensor shape.
dtype(LiteDataType): the datatype of the single batch tensor and the
result tensor, default value is LiteDataType.LITE_INT8.
device_type(LiteDeviceType): the target device type the result tensor
will allocate, default value is LiteDeviceType.LITE_CUDA.
device_id: the device id the result tensor will allocate, default 0.
is_pinned_host: Whether the memory is pinned memory, refer to CUDA
pinned memory, default False.
tensor(LiteTensor): the result tensor, user can also create the multi
batch size tensor and then create the TensorBatchColletor, if tensor is
not None, all the member, such as shape, dtype, device_type,
device_id, is_pinned_host will get from the tensor, if the tensor is
None and the result tensor will create by the TensorBatchCollector,
default is None.
Note:
when collect tensor, the single batch tensor or array shape must match the
result tensor shape except the batch size dimension (the highest dimension)
Examples:
.. code-block:: python
import numpy as np
batch_tensor = TensorBatchCollector([4, 8, 8])
arr = np.ones([8, 8], "int8")
for i in range(4):
batch_tensor.collect(arr)
arr += 1
data = batch_tensor.to_numpy()
assert data.shape[0] == 4
assert data.shape[1] == 8
assert data.shape[2] == 8
for i in range(4):
for j in range(64):
assert data[i][j // 8][j % 8] == i + 1
""" """
def __init__( def __init__(
...@@ -45,6 +91,17 @@ class TensorBatchCollector: ...@@ -45,6 +91,17 @@ class TensorBatchCollector:
) )
def collect_id(self, array, batch_id): def collect_id(self, array, batch_id):
"""
Collect a single batch through an array and store the array data to the
specific batch_id.
Args:
array: an array maybe LiteTensor or numpy ndarray, the shape of
array must match the result tensor shape except the highest
dimension.
batch_id: the batch id to store the array data to the result tensor,
if the batch_id has already collected, a warning will generate.
"""
# get the batch index # get the batch index
with self._mutex: with self._mutex:
if batch_id in self._free_list: if batch_id in self._free_list:
...@@ -87,6 +144,14 @@ class TensorBatchCollector: ...@@ -87,6 +144,14 @@ class TensorBatchCollector:
return batch_id return batch_id
def collect(self, array): def collect(self, array):
"""
Collect a single batch through an array and store the array data to an
empty batch, the empty batch is the front batch id in free list.
Args:
array: an array maybe LiteTensor or numpy ndarray, the shape must
match the result tensor shape except the highest dimension
"""
with self._mutex: with self._mutex:
if len(self._free_list) == 0: if len(self._free_list) == 0:
warnings.warn( warnings.warn(
...@@ -98,7 +163,13 @@ class TensorBatchCollector: ...@@ -98,7 +163,13 @@ class TensorBatchCollector:
def collect_by_ctypes(self, data, length): def collect_by_ctypes(self, data, length):
""" """
collect with ctypes data input Collect a single batch through an ctypes memory buffer and store the
ctypes memory data to an empty batch, the empty batch is the front
batch id in free list.
Args:
array: an array maybe LiteTensor or numpy ndarray, the shape must
match the result tensor shape except the highest dimension
""" """
with self._mutex: with self._mutex:
if len(self._free_list) == 0: if len(self._free_list) == 0:
...@@ -116,6 +187,13 @@ class TensorBatchCollector: ...@@ -116,6 +187,13 @@ class TensorBatchCollector:
subtensor.copy_from(pinned_tensor) subtensor.copy_from(pinned_tensor)
def free(self, indexes): def free(self, indexes):
"""
free the batch ids in the indexes, after the batch id is freed, it can
be collected again without warning.
Args:
indexes: a list of to be freed batch id
"""
with self._mutex: with self._mutex:
for i in indexes: for i in indexes:
if i in self._free_list: if i in self._free_list:
...@@ -126,7 +204,13 @@ class TensorBatchCollector: ...@@ -126,7 +204,13 @@ class TensorBatchCollector:
self._free_list.extend(indexes) self._free_list.extend(indexes)
def get(self): def get(self):
"""
After finish collection, get the result tensor
"""
return self._tensor return self._tensor
def to_numpy(self): def to_numpy(self):
"""
Convert the result tensor to a numpy ndarray
"""
return self._tensor.to_numpy() return self._tensor.to_numpy()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册