Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ModelZoo
ResNet50_migraphx
Commits
b4a869e5
Commit
b4a869e5
authored
Nov 08, 2023
by
liucong
Browse files
修改doc下的cpp文档
parent
3bce2cf5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
31 additions
and
14 deletions
+31
-14
Doc/Tutorial_Cpp.md
Doc/Tutorial_Cpp.md
+31
-14
No files found.
Doc/Tutorial_Cpp.md
View file @
b4a869e5
...
...
@@ -135,8 +135,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
// 预处理
// 创建输入数据
migraphx
::
argument
result
;
// 当offload为true时,不需要内存拷贝
if
(
useoffloadcopy
)
{
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
...
...
@@ -146,32 +145,50 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
std
::
vector
<
std
::
string
>
outputNames
=
{
"resnetv24_dense0_fwd"
};
// 设置返回的输出节点
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
inputData
,
outputNames
);
result
=
results
[
0
];
// 获取第一个输出节点的数据
// 获取输出节点的属性
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
float
*
logits
=
(
float
*
)
result
.
data
();
// 输出节点数据指针
...
}
else
else
// 当offload为false时,需要内存拷贝
{
// 为输出节点分配device内存,用于保存输出数据
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
modelData
=
CreateOutputData
(
net
);
// 将输入转换为device数据
migraphx
::
argument
inputData
=
migraphx
::
gpu
::
to_gpu
(
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
});
migraphx
::
argument
inputData
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
//
使用
device
数据作为输入数据,inputData.data()返回的是device地址
modelData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
inputData
.
data
()}
;
//
拷贝到
device
输入内存
hipMemcpy
(
inputBuffer_Device
,
inputData
.
data
(),
inputShape
.
bytes
(),
hipMemcpyHostToDevice
)
;
// 推理
std
::
vector
<
std
::
string
>
outputNames
=
{
"resnetv24_dense0_fwd"
};
// 设置返回的输出节点
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
modelData
,
outputNames
);
std
::
vector
<
std
::
string
>
outputNames
=
{
"resnetv24_dense0_fwd"
};
// 设置返回的输出节点
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
programParameters
,
outputNames
);
// 获取输出节点的属性
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
result
=
migraphx
::
gpu
::
from_gpu
(
results
[
0
]);
// 将第一个输出节点的数据拷贝到host端
// 将device输出数据拷贝到分配好的host输出内存
hipMemcpy
(
outputBuffer_Host
,
outputBuffer_Device
,
outputShapes
.
bytes
(),
hipMemcpyDeviceToHost
);
// 直接使用事先分配好的输出内存拷贝
...
// 释放
hipFree
(
inputBuffer_Device
);
hipFree
(
outputBuffer_Device
);
free
(
outputBuffer_Host
);
}
...
}
```
-
输入数据根据是否需要数据拷贝分为两种:offload=true、offload=false。当offload为true时,执行if分支,不需要进行内存拷贝,inputData表示MIGraphX的输入数据,inputData是一个映射关系,每个输入节点名都会对应一个输入数据,如果有多个输入,则需要为每个输入节点名创建数据,inputName表示输入节点名,migraphx::argument{inputShape, (float
*
)inputBlob.data}表示该节点名对应的数据,这里是通过前面预处理的数据inputBlob来创建的,第一个参数表示数据的shape,第二个参数表示数据指针。当offload为false时,执行else分支,需要进行内存拷贝,为输入节点
和输出节点分配device内存,用来保存输入数据和输出数据,使用device数据作为输入数据,执行推理
。
-
输入数据根据是否需要数据拷贝分为两种:offload=true、offload=false。当offload为true时,执行if分支,不需要进行内存拷贝,inputData表示MIGraphX的输入数据,inputData是一个映射关系,每个输入节点名都会对应一个输入数据,如果有多个输入,则需要为每个输入节点名创建数据,inputName表示输入节点名,migraphx::argument{inputShape, (float
*
)inputBlob.data}表示该节点名对应的数据,这里是通过前面预处理的数据inputBlob来创建的,第一个参数表示数据的shape,第二个参数表示数据指针。当offload为false时,执行else分支,需要进行内存拷贝,为输入节点
拷贝到device端,经过推理后,再将输出节点数据拷贝到host端
。
-
net.eval(inputData)返回模型的推理结果,由于这里只有一个输出节点,所以std::vector中只有一个数据,results[0]表示第一个输出节点,这里对应resnetv24_dense0_fwd节点,获取输出数据。
另外,如果想要指定输出节点,可以在eval()方法中通过提供outputNames参数来实现:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment