tensorrt使用教程(查看tensorrt安装位置)

TensorFlow-TensorRT(TF-TRT)是TensorFlow和TensorRT的集成,可在TensorFlow生态系统中对NVIDIAGPU的推理进行优化。它提供的简单API能够轻而易举地在使用NVIDIAGPU时带来巨大性能提升。该集成使TensorRT中的优化可被使用,并在遇到TensorRT不支持的模型部分算子时提供到原生TensorFlow的回退。 TensorRThttp…

TensorFlow-TensorRT (TF-TRT) 是 TensorFlow 和 TensorRT 的集成,可在 TensorFlow 生态系统中对 NVIDIA GPU 的推理进行优化。它提供的简单 API 能够轻而易举地在使用 NVIDIA GPU 时带来巨大性能提升。该集成使 TensorRT 中的优化可被使用,并在遇到 TensorRT 不支持的模型部分算子时提供到原生 TensorFlow 的回退。

  • TensorRT
    https://developer.nvidia.com/tensorrt

先前关于 TF-TRT 集成的文章中,我们介绍了 TensorFlow 1.13 和更早版本的工作流。这篇文章将介绍 TensorFlow 2.x 中的 TensorRT 集成,并展示最新 API 的示例工作流。如果您刚接触此集成,这并无大碍,本文包含所有入门所需的信息。与 NVIDIA T4 GPU 上的使用原生 TensorFlow 推理相比,使用 TensorRT 集成可以将性能提高 2.4 倍。

  • 文章
    https://blog.tensorflow.org/2019/06/high-performance-inference-with-TensorRT.html

TF-TRT 集成

启用 TF-TRT 后,第一步解析经过训练的模型,将计算图分为 TensorRT 支持的子计算图和不支持的子计算图。然后,每个 TensorRT 支持的子计算图都被封装在一个特殊的 TensorFlow 运算 (TRTEngineOp) 中。第二步,为每个 TRTEngineOp 节点构建一个优化的 TensorRT 引擎。TensorRT 不支持的子计算图保持不变,由 TensorFlow 运行时处理。如图 1 所示。

  • TF-TRT
    https://github.com/tensorflow/tensorrt
  • TensorRT 支持的
    https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html?ncid=partn-31097#supported-ops

TF-TRT 既可以利用 TensorFlow 的灵活性,同时还可以利用可应用于 TensorRT 支持的子计算图的优化。TensorRT 只优化和执行计算图的一部分,剩余的计算图由 TensorFlow 执行。

在图 1 所示推理示例中,TensorFlow 执行了 Reshape 运算和 Cast 运算。然后,TensorFlow 将预构建的 TensorRT 引擎 TRTEngineOp_0 的执行传递至 TensorRT 运行时。利用 TensorRT 实现 TensorFlow低延迟推理

图 1:计算图分区和在 TF-TRT 中构建 TRT 引擎的示例

工作流

在这一部分中,我们将通过一个示例研究典型的 TF-TRT 工作流。利用 TensorRT 实现 TensorFlow低延迟推理

图 2仅在 TensorFlow中执行推理,以及在TensorFlow-TensorRT中使用转换后的SavedModel执行推理时的工作流图

图 2 显示了原生 TensorFlow 中的标准推理工作流,并与 TF-TRT 工作流进行了对比。SavedModel 格式包含共享或部署经过训练的模型所需的所有信息。在原生 TensorFlow 中,工作流通常涉及加载保存的模型并使用 TensorFlow 运行时运行推理。在 TF-TRT 中还涉及一些额外步骤,包括将 TensorRT 优化应用到 TensorRT 支持的模型子计算图,以及可选地预先构建 TensorRT 引擎。

  • SavedModel
    https://tensorflow.google.cn/guide/saved_model

首先,创建一个对象来存放转换参数,包括一个精度模式。精度模式用于指示 TF-TRT 可以用来实现 TensorFlow 运算的最低精度(例如 FP32、FP16 或 INT8)。然后创建一个转换器对象,它从保存的模型中获取转换参数和输入。注意,在 TensorFlow 2.x 中,TF-TRT 仅支持以 TensorFlow SavedModel 格式保存的模型。

接下来,当我们调用转换器 convert() 方法时,TF-TRT 将用 TRTEngineOps 替换 TensorRT 兼容的部分以转换计算图。如需在运行时获得更好的性能,可以使用转换器 build() 方法提前创建 TensorRT 执行引擎。build() 方法要求,在构建优化的 TensorRT 执行引擎之前必须已知输入数据形状。如果输入数据形状未知,则在输入数据可用时,可以在运行时构建 TensorRT 执行引擎。要在 GPU 上构建 TensorRT 执行引擎,GPU 的设备类型应与执行推理的设备类型相同,因为构建过程特定于 GPU。例如,为 NVIDIA A100 GPU 构建的执行引擎将无法在 NVIDIA T4 GPU 上运行。

  • build()
    https://tensorflow.google.cn/api_docs/python/tf/experimental/tensorrt/Converter

最后,可以调用 save 方法将 TF-TRT 转换的模型保存到磁盘。本部分提及的工作流步骤的对应代码如以下代码块所示:

from tensorflow.python.compiler.tensorrt import trt_convert as trt

# Conversion Parameters 
conversion_params = trt.TrtConversionParams(
precision_mode=trt.TrtPrecisionMode.<FP32 or FP16>)

converter = trt.TrtGraphConverterV2(
input_saved_model_dir=input_saved_model_dir,
conversion_params=conversion_params)

# Converter method used to partition and optimize TensorRT compatible segments
converter.convert()

# Optionally, build TensorRT engines before deployment to save time at runtime
# Note that this is GPU specific, and as a rule of thumb, we recommend building at runtime
converter.build(input_fn=my_input_fn)

# Save the model to the disk 
converter.save(output_saved_model_dir)
  • save
    https://tensorflow.google.cn/api_docs/python/tf/experimental/tensorrt/Converter

由以上代码示例可知,build() 方法需要一个与输入数据形状对应的输入函数。输入函数示例如下所示:

# input_fn: a generator function that yields input data as a list or tuple,
# which will be used to execute the converted signature to generate TensorRT
# engines. Example:
def my_input_fn():
# Let\'s assume a network with 2 input tensors. We generate 3 sets
# of dummy input data:
input_shapes = [[(1, 16), (2, 16)], # min and max range for 1st input list
[(2, 32), (4, 32)], # min and max range for 2nd list of two tensors
[(4, 32), (8, 32)]] # 3rd input list
for shapes in input_shapes:
# return a list of input tensors
yield [np.zeros(x).astype(np.float32) for x in shapes]

对 INT8 的支持

相较于 FP32 和 FP16,INT8 需要额外的校准数据来确定最佳量化阈值。当转换参数中的精度模式为 INT8 时,需要为 convert() 方法调用提供输入函数。此输入函数类似于提供至 build() 方法的输入函数。此外,传递至 convert() 方法的输入函数所生成的校准数据应与推理过程中可见的实际数据在统计上相似。

from tensorflow.python.compiler.tensorrt import trt_convert as trt

conversion_params = trt.TrtConversionParams(
precision_mode=trt.TrtPrecisionMode.INT8)

converter = trt.TrtGraphConverterV2(
input_saved_model_dir=input_saved_model_dir,
conversion_params=conversion_params)

# requires some data for calibration
converter.convert(calibration_input_fn=my_input_fn)

# Optionally build TensorRT engines before deployment.
# Note that this is GPU specific, and as a rule of thumb we recommend building at runtime
converter.build(input_fn=my_input_fn)

converter.save(output_saved_model_dir)

示例:ResNet-50

本文其余部分的工作流将采用 TensorFlow 2.x ResNet-50 模型,对其进行训练、保存、使用 TF-TRT 优化,以及最后部署,用于推理。我们还将在 FP32、FP16 和 INT8 三种精度模式下使用 TensorFlow 原生与 TF-TRT 比较推理吞吐量。

示例的前提条件

  • Ubuntu OS
  • Docker (https://docs.docker.com/get-docker)
  • 最新 TensorFlow 2.x 容器:
    • docker pull tensorflow/tensorflow:latest-gpu
  • NVIDIA Container Toolkit (https://github.com/NVIDIA/NVIDIA-docker),这允许您在 docker 容器中使用 NVIDIA GPU。
  • 安装在主机上的 NVIDIA Driver >= 450(编写时,应检查最新 tensorflow 容器的要求)。您可以运行以下命令检查您的计算机上当前安装的版本:nvidia-smi | grep “Driver Version:”
  • NVIDIA Driver >= 450
    https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html

使用 TensorFlow 2.x 容器训练 ResNet-50

首先,需要从 TensorFlow GitHub 仓库下载 ResNet-50 模型的最新版本:

# Adding the git remote and fetch the existing branches
$ git clone --depth 1 https://github.com/tensorflow/models.git .

# List the files and directories present in our working directory
$ ls -al

rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:05 2020 ./
rwxrwxr-x user user 4 KiB Wed Sep 30 15:30:45 2020 ../
rw-rw-r-- user user 337 B Wed Sep 30 15:31:05 2020 AUTHORS
rw-rw-r-- user user 1015 B Wed Sep 30 15:31:05 2020 CODEOWNERS
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:05 2020 community/
rw-rw-r-- user user 390 B Wed Sep 30 15:31:05 2020 CONTRIBUTING.md
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:15 2020 .git/
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:05 2020 .github/
rw-rw-r-- user user 1 KiB Wed Sep 30 15:31:05 2020 .gitignore
rw-rw-r-- user user 1 KiB Wed Sep 30 15:31:05 2020 ISSUES.md
rw-rw-r-- user user 11 KiB Wed Sep 30 15:31:05 2020 LICENSE
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:05 2020 official/
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:05 2020 orbit/
rw-rw-r-- user user 3 KiB Wed Sep 30 15:31:05 2020 README.md
rwxrwxr-x user user 4 KiB Wed Sep 30 15:31:06 2020 research/

如前一部分所述,本示例将使用 Docker 存储库中的最新 TensorFlow 容器:由于容器中已经包含 TensorRT 集成,因此用户不需要执行任何其他安装步骤。容器的拉取和启动步骤如下:

$ docker pull tensorflow/tensorflow:latest-gpu

# Please ensure that the Nvidia Container Toolkit is installed before running the following command
$ docker run -it --rm 
--gpus=\"all\" 
--shm-size=2g --ulimit memlock=-1 --ulimit stack=67108864 
--workdir /workspace/ 
-v \"$(pwd):/workspace/\" 
-v \"</path/to/save/data/>:/data/\"  # This is the path that will hold the training data
tensorflow/tensorflow:latest-gpu

随后即可在容器内部验证是否有权访问相关文件和要针对的 NVIDIA GPU:

# Let\'s first test that we can access the ResNet-50 code that we previously downloaded
$ ls -al
drwxrwxr-x 8 1000 1000 4096 Sep 30 22:31 .git
drwxrwxr-x 3 1000 1000 4096 Sep 30 22:31 .github
-rw-rw-r-- 1 1000 1000 1104 Sep 30 22:31 .gitignore
-rw-rw-r-- 1 1000 1000 337 Sep 30 22:31 AUTHORS
-rw-rw-r-- 1 1000 1000 1015 Sep 30 22:31 CODEOWNERS
-rw-rw-r-- 1 1000 1000 390 Sep 30 22:31 CONTRIBUTING.md
-rw-rw-r-- 1 1000 1000 1115 Sep 30 22:31 ISSUES.md
-rw-rw-r-- 1 1000 1000 11405 Sep 30 22:31 LICENSE
-rw-rw-r-- 1 1000 1000 3668 Sep 30 22:31 README.md
drwxrwxr-x 2 1000 1000 4096 Sep 30 22:31 community
drwxrwxr-x 12 1000 1000 4096 Sep 30 22:31 official
drwxrwxr-x 3 1000 1000 4096 Sep 30 22:31 orbit
drwxrwxr-x 23 1000 1000 4096 Sep 30 22:31 research

# Let\'s verify we can see our GPUs:
$ nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.XX.XX Driver Version: 450.XX.XX CUDA Version: 11.X |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla T4 On | 00000000:1A:00.0 Off | Off |
| 38% 52C P8 14W / 70W | 1MiB / 16127MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

接下来开始训练 ResNet-50。为了避免花费大量时间训练深度学习模型,本文将使用较小的MNIST 数据集。不过,对于 ImageNet 这样更先进的数据集,工作流也不会发生改变。

# Install dependencies
$ pip install tensorflow_datasets tensorflow_model_optimization

# Download MNIST data and Train
$ python -m \"official.vision.image_classification.mnist_main\" 
--model_dir=./checkpoints 
--data_dir=/data 
--train_epochs=10 
--distribution_strategy=one_device 
--num_gpus=1 
--download

# Let’s verify that we have the trained model saved on our machine.
$ ls -al checkpoints/

-rw-r--r-- 1 root root 87 Sep 30 22:34 checkpoint
-rw-r--r-- 1 root root 6574829 Sep 30 22:34 model.ckpt-0001.data-00000-of-00001
-rw-r--r-- 1 root root 819 Sep 30 22:34 model.ckpt-0001.index
[...]
-rw-r--r-- 1 root root 6574829 Sep 30 22:34 model.ckpt-0010.data-00000-of-00001
-rw-r--r-- 1 root root 819 Sep 30 22:34 model.ckpt-0010.index
drwxr-xr-x 4 root root 4096 Sep 30 22:34 saved_model
drwxr-xr-x 3 root root 4096 Sep 30 22:34 train
drwxr-xr-x 2 root root 4096 Sep 30 22:34 validation

获取 TF-TRT 将使用的 SavedModel

经过训练,Google 的 ResNet-50 代码将以 SavedModel 格式导出模型,路径如下:checkpoints/saved_model/

以下示例代码可以作为参考,以将您自己的训练模型导出为 TensorFlow SavedModel。

import numpy as np

import tensorflow as tf
from tensorflow import keras

def get_model():
# Create a simple model.
inputs = keras.Input(shape=(32,))
outputs = keras.layers.Dense(1)(inputs)
model = keras.Model(inputs, outputs)
model.compile(optimizer=\"adam\", loss=\"mean_squared_error\")
return model

model = get_model()

# Train the model.
test_input = np.random.random((128, 32))
test_target = np.random.random((128, 1))
model.fit(test_input, test_target)

# Calling `save(\'my_model\')` creates a SavedModel folder `my_model`.
model.save(\"my_model\")
  • 代码
    https://tensorflow.google.cn/guide/keras/save_and_serialize#savedmodel_format

我们可以验证 Google 的 ResNet-50 脚本生成的 SavedModel 是否可读和正确:

$ ls -al checkpoints/saved_model

drwxr-xr-x 2 root root 4096 Sep 30 22:49 assets
-rw-r--r-- 1 root root 118217 Sep 30 22:49 saved_model.pb
drwxr-xr-x 2 root root 4096 Sep 30 22:49 variables

$ saved_model_cli show --dir checkpoints/saved_model/ --tag_set serve --signature_def serving_default

MetaGraphDef with tag-set: \'serve\' contains the following SignatureDefs:

The given SavedModel SignatureDef contains the following input(s):
inputs[\'input_1\'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 28, 28, 1)
name: serving_default_input_1:0
The given SavedModel SignatureDef contains the following output(s):
outputs[\'dense_1\'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 10)
name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

验证 SavedModel 已正确保存后,我们可以使用 TF-TRT 进行加载以开始推理。

推理

使用 TF-TRT 执行 ResNet-50 推理

本部分将介绍如何使用 TF-TRT 在 NVIDIA GPU 上部署保存的 ResNet-50 模型。如前所述,首先使用 convert 方法将 SavedModel 转换为 TF-TRT 模型,然后加载模型。

# Convert the SavedModel
converter = trt.TrtGraphConverterV2(input_saved_model_dir=path)
converter.convert()

# Save the converted model
converter.save(converted_model_path)

# Load converted model and infer
model = tf.saved_model.load(converted_model_path)
func = root.signatures[\'serving_default\']
output = func(input_tensor)

为简单起见,我们将使用脚本执行推理 (tf2_inference.py)。我们将从 github.com 下载脚本,并将其放在与先前相同的 docker 容器的工作目录 “/workspace/” 中。随后即可执行脚本:

$ wget https://raw.githubusercontent.com/tensorflow/tensorrt/master/tftrt/blog_posts/Leveraging%20TensorFlow-TensorRT%20integration%20for%20Low%20latency%20Inference/tf2_inference.py

$ ls
AUTHORS CONTRIBUTING.md LICENSE checkpoints data orbit tf2_inference.py
CODEOWNERS ISSUES.md README.md community official research

$ python tf2_inference.py --use_tftrt_model --precision fp16

=========================================
Inference using: TF-TRT …
Batch size: 512
Precision: fp16
=========================================

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TrtConversionParams(rewriter_config_template=None, max_workspace_size_bytes=8589934592, precision_mode=\'FP16\', minimum_segment_size=3, is_dynamic_op=True, maximum_cached_engines=100, use_calibration=True, max_batch_size=512, allow_build_at_runtime=True)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Processing step: 0100 ...
Processing step: 0200 ...
[...]
Processing step: 9900 ...
Processing step: 10000 ...

Average step time: 2.1 msec
Average throughput: 244248 samples/sec
  • tf2_inference.py
    https://github.com/tensorflow/tensorrt/blob/master/tftrt/blog_posts/Leveraging%20TensorFlow-TensorRT%20integration%20for%20Low%20latency%20Inference/tf2_inference.py
  • github.com
    https://raw.githubusercontent.com/tensorflow/tensorrt/master/tftrt/blog_posts/Leveraging%20TensorFlow-TensorRT%20integration%20for%20Low%20latency%20Inference/tf2_inference.py

同样,我们可为 INT8FP32 运行推理

$ python tf2_inference.py --use_tftrt_model --precision int8

$ python tf2_inference.py --use_tftrt_model --precision fp32

使用原生 TensorFlow (GPU) FP32 执行推理

您也可以不采用 TF-TRT 加速,运行未经修改的 SavedModel。

$ python tf2_inference.py --use_native_tensorflow

=========================================
Inference using: Native TensorFlow …
Batch size: 512
=========================================

Processing step: 0100 ...
Processing step: 0200 ...
[...]
Processing step: 9900 ...
Processing step: 10000 ...

Average step time: 4.1 msec
Average throughput: 126328 samples/sec

此运行使用 NVIDIA T4 GPU 执行。同样的工作流可以在任何 NVIDIA GPU 上运行。

原生 TF 2.x 与 TF-TRT 推理性能对比

借助 TF-TRT,只需进行少量代码修改可显著提高性能。例如,使用本文中的推理脚本,在 NVIDIA T4 GPU 上的批处理大小为 512,我们观察到 TF-TRT FP16 的速度几乎比原生 TensorFlow 提升了 2 倍,TF-TRT INT8 的速度提升了 2.4 倍。实际速度提升可能因各种因素而异,如使用的模型、批处理大小、数据集中图像的大小和格式以及 CPU 瓶颈。

我们在本文中展示了 TF-TRT 提供的加速。此外,通过 TF-TRT,我们可以使用完整的 TensorFlow Python API 和 Jupyter Notebook 或 Google Colab 等交互式环境。

支持的算子

TF-TRT 用户指南列出了 TensorRT 兼容子计算图中支持的算子。列表之外的算子将由原生 TensorFlow 运行时执行。

  • 算子
    https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html?ncid=partn-31097#supported-ops

我们希望您能亲自尝试,如果遇到问题,请在 Github 上提 issue。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月12日 下午6:52
下一篇 2022年5月12日 下午6:52

相关推荐

  • 网上创业有哪些项目,网上0成本创业项目推荐

    2020是资本寒冬的一年,小黄车陷入绝境、锤子科技资金料断裂,P2P业务陷入死循环……好像所有跟互联网有关的创业都在经历一场前有未有的考验。有困境也自然意味着经会产生新的机遇与方向,而一些传统的互联网创业项目依旧还有可以深挖之处。可以预见的是,202020年互联网创业依旧会是众多创业者心中的热门之选,而投资市场也会风云变幻。那么,2020年有哪些是互联网创业中的热门项目呢? 一、智慧物联 物流在日…

    2022年7月15日
    690
  • 小红书推广方案有哪些,小红书运营和推广策略

    想必你也听过不少小红书案例,可能自己也在摸索当中。这次我为你带来小红书精准引流三大技巧,帮助你快速掘金。这次的内容很重要,因为: 1、能帮你快速了解小红书规则,避免踩坑和做出效果; 2、帮你解除限流、禁言、封号的难题,避免违规; 3、帮助你精准引流,高效变现。 言归正传,今天的分享,主要是3个方面 ①小红书避坑指南 ②限流、封号、禁言的实用解决方法 ③小红书精准引流三大实用技巧 下载报告请

    2022年5月25日
    680
  • lol打野怎么玩,学会这5招保你轻松上钻石

    打野英雄作为LOL前期最能带节奏的一个位置,其重要性当然不言而喻,高端打野玩家可以在前期就帮队伍建立巨大的优势,然后利用优势滚起雪球拿下胜利,而菜逼打野只会葬送了自己又陪进队友,让游戏进入无止境的黑洞,所以打野这个位置是常年的背锅位,那么如果才能玩好打野呢? 如果你是最近才开始玩打野这个位置,那么下面小编为你准备了前期比较重要的5个小技巧,或许可以帮你在短时间内迅速提升打野能力哦! 1、摸清对方的…

    2022年9月13日
    560
  • 网上什么赚钱快不要本钱,网上赚钱无需投资的项目

    说来惭愧,我在互联网行业混的时间也不短了,其实并没有什么大的成就,赚的钱也只够养家糊口,我入行至今,也并没什么背景,更无人脉,完全就是一个草根,从一个搞野路子的草根站长,到今天做自媒体,乱七八糟赚钱的方式尝试了很多,走过的坑就不更用讲了。 为什么写今天这篇文章,这几天我收到了很多人的微信消息,讲自己的生活经历,以及自己对于赚钱的渴望,我了解了他们的经历后,所以就想单独写这门一篇文章,认真谈谈目前网…

    2022年8月9日
    510
  • 哪种输入法打字最快,公认速度最快的7种输入法

    以下介绍的7种输入法包括:自然码双拼、琴码输入法、小仙并击、五笔、亚伟中文速录、小鹤音形、讯飞语音。 1.自然码双拼:衍生于全拼,称雄于双拼 原理:自然码是双拼的代表,是建立在全拼基础上的输入法。原理是一个键位代表声母,一个键位代表韵母,只要按下两个键就可以打出任何字。比如打:犬神大人。全拼是:quanshendaren,而用双拼输入法则是:qrufdarf。 优点:简单易学,节奏感好。 缺点:重…

    2022年9月13日
    4.6K0
  • 百度推广效果怎样,百度推广流程与费用

    百度推广的流程,说来也是很简单的,只要符合行业资质条件,审核通过后即可开户。具体如下: 1、百度推广开户流程是什么? 开通百度推广,首先您需要签订合同‍且缴纳首次开户费用‍,后期会有相关人员审核您的相关资质,如果您想要详细了解资质要求,您的营销顾问可以帮助您。 2、百度推广开户条件有哪些? 企业加入百度推广,首先需要建立一个网站,或者在其他企业平台上建立网页,另外还需要通过百度 推广的企业客户资质…

    2022年6月25日
    570
  • 销售手段有哪些,10种销售技巧与话术

    营销管理 本文讲给你带来至少3倍销量。说了很多经典营销手段,但问题是无法落地。今天我就给大家分享10种营销手段+3个实操案例,简单易懂,希望各位在看过之后能够有所收获。 一、店铺内功 主图、详情页等等都是店铺内功的基础。只有在做好这些的基础上,我们才能去谈营销手法。 二、营销手段 1、利益诱惑 这个营销手法比较常见,通常都是通过送赠品来吸引顾客。 还有一种赠送方式,就是送电子版产品,这个东西不仅不…

    2022年8月10日
    620
  • 做网络推广真的有用吗,网络推广趋势及主要技巧

    网络推广到地有没有用这个问题一直困扰这许多的企业,投钱觉得万一没效果怎么办,我的钱砸下去了,一点效果也没有起到。 判断社交网络推广对客户有没有用,可以从下几个维度做判断: 1.企业品牌或产品与消费者的亲密度 2.企业品牌或产品购买决策者与网络的亲密度 3.企业所处行业的成熟度和特性 首先根据1、2两个原则,把我之前做过的一些客户放在适合的位置,做了一张图: 注意,考虑到最后一个特性和不同客户自身的…

    2022年6月22日
    780
  • 腾讯推出微信小商店小程序,是否动了有赞得有店SaaS厂商们的“奶酪”?

    近日,腾讯宣布,微信小商店正式上线,只要是企业、个体工商户,目前均可主动发起内测申请。在开通条件上,微信小商店也支持个人开店,不过目前还未开放,个人开店后续将逐步放开。 关于微信小商店 据微信官方介绍,微信小商店是小程序团队提供的一项新能力,帮助商家免开发并快速生成卖货小程序。支持商品售卖、订单物流、客服售后、小程序直播等功能,并且是免费提供给商家。 其实,说起微信小商店,并不新鲜,早在2014年…

    2022年9月5日
    690
  • 发表文章去哪里投稿,投稿写文章赚钱的网站推荐

    写文章投稿投到哪里,要看你的目的是什么?如果是为了赚取稿费,可以投给一些公众号大号、杂志来获得稿费。如果你不是为了赚稿费,而是为了建立自己的个人品牌,或是只是想更多的人读到你写的东西,就可以把文章发布到一些自媒体平台。 我们接下来详细的说一说。 1.为了赚取稿费 如果你是为了赚取稿费的话,就可以投稿到一些公众号大号,或者投给杂志编辑,投稿给公众号比较好操作。 首先你要先关注一些自己比较感兴趣的公众…

    2022年6月23日
    660

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信