Featured image of post C++ рд╕реЗ Microsoft.Windows.AI рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛

C++ рд╕реЗ Microsoft.Windows.AI рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛

ЁЯОп C++ рд╕реЗ Microsoft.Windows.AI рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛уАРрдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рдеуАС

Windows 10 рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, Windows рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ ONNX рдкреНрд░рд╛рд░реВрдк рдХреЗ AI рдореЙрдбрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рд╡рд╣ Windows ML (Windows.AI.MachineLearning) рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо C++ (Win32 рдРрдк рдЖрдзрд╛рд░рд┐рдд) рд╕реЗ Microsoft.Windows.AI.MachineLearning рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдордЭрд╛рдПрдВрдЧреЗред


тЬЕ рддреИрдпрд╛рд░реА

тЧ╛ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡реЗрд╢

  • Windows 10 (1809+) рдпрд╛ Windows 11
  • Visual Studio 2019 рдпрд╛ рдирдпрд╛ (Community рд╕рдВрд╕реНрдХрд░рдг рднреА рдареАрдХ рд╣реИ)
  • C++/WinRT рд╕рдорд░реНрдерди (Microsoft.Windows.CppWinRT)
  • Windows SDK 10.0.17763.0 рдпрд╛ рдЙрдЪреНрдЪрддрд░

тЬЕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛

Visual Studio рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред

  • рдкреНрд░рдХрд╛рд░: C++ Windows рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ)

  • рд╕рдмрд╕рд┐рд╕реНрдЯрдо: Windows (WinMain)

  • NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВ

    1
    
    Microsoft.Windows.CppWinRT
    

тЬЕ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб

рдиреАрдЪреЗ WinMain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Win32 API рдФрд░ Windows.AI.MachineLearning рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

тА╗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ ONNX рдореЙрдбрд▓ model.onnx рд╣реИ, рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ (executable file) рдХреЗ рд╕рдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <windows.h>
#include <winrt/Windows.AI.MachineLearning.h>
#include <winrt/Windows.Storage.h>

#pragma comment(lib, "windowsapp") // WinRT рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП

using namespace winrt;
using namespace Windows::AI::MachineLearning;
using namespace Windows::Storage;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    // WinRT рдЖрд░рдВрднреАрдХрд░рдг (MTA рдпрд╛ STA рдареАрдХ рд╣реИ)
    winrt::init_apartment();

    try {
        // рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░реЗрдВ
        auto modelFile = StorageFile::GetFileFromPathAsync(L"model.onnx").get();
        LearningModel model = LearningModel::LoadFromStorageFileAsync(modelFile).get();

        // рд╕рддреНрд░ (Session) рдмрдирд╛рдПрдВ
        LearningModelSession session(model);
        LearningModelBinding binding(session);

        // рдореЙрдбрд▓ рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ (рдпрд╣рд╛рдБ рдПрдХ рдбрдореА рдЦрд╛рд▓реА рдЗрдирдкреБрдЯ рд╣реИ)
        // рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ TensorFloat рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

        // рдЕрдиреБрдорд╛рди (Inference) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
        auto result = session.EvaluateAsync(binding, L"").get();

        MessageBox(nullptr, L"рдЕрдиреБрдорд╛рди рдкреВрд░рд╛ рд╣реБрдЖ", L"Windows ML (C++)", MB_OK);
    }
    catch (winrt::hresult_error const& ex) {
        MessageBox(nullptr, ex.message().c_str(), L"рддреНрд░реБрдЯрд┐", MB_ICONERROR);
    }

    return 0;
}

тЬЕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА: рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ Tensor рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛

рдХреБрдЫ рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдорд╛рди (inference) рд╕реЗ рдкрд╣рд▓реЗ Tensor рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

1
2
3
4
5
6
7
8
// 1-рдЖрдпрд╛рдореА float рд╕рд░рдгреА рдХреЛ Tensor рдореЗрдВ рдмрджрд▓реЗрдВ
std::vector<float> inputData = {0.5f, 0.3f, 0.2f};
std::vector<int64_t> shape = {1, 3}; // рдЖрдХрд╛рд░: [1, 3]

auto tensor = TensorFloat::CreateFromArray(shape, inputData);

// рдЗрдирдкреБрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рдореЙрдбрд▓ рдХреЗ рдЗрдирдкреБрдЯ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)
binding.Bind(L"input_0", tensor);

рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рднреА рдЗрд╕реА рддрд░рд╣ result.Outputs().Lookup(L"output_0") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


тЬЕ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рддреЗрдВ

  • рдпрджрд┐ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ FileNotFoundException рдлреЗрдВрдХрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдпрджрд┐ рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдирд╛рдо рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ invalid_argument рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред
  • рдореЙрдбрд▓ рдХреЗ рд╕рдЯреАрдХ IO рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ Netron рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

тЬЕ рдирд┐рд╖реНрдХрд░реНрд╖

рдЖрдЗрдЯрдорд╡рд┐рд╡рд░рдг
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ APIWindows.AI.MachineLearning (WinRT)
рднрд╛рд╖рд╛C++ (Win32 рдЖрдзрд╛рд░рд┐рдд)
рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдзрд┐C++/WinRT рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
рд▓рд╛рднONNX рдореЙрдбрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ (natively) рдЪрд▓рддреЗ рд╣реИрдВ, GPU рд╕рдорд░реНрдерди рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ
рдзреНрдпрд╛рди рджреЗрдВрдореЙрдбрд▓ рдЗрдирдкреБрдЯ рдирд╛рдо рдФрд░ Tensor рдЖрдХрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ

тЬЕ рд╡рд┐рдХрд▓реНрдк: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ WinRT рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

  • Microsoft рдХреЗ ONNX Runtime рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ WinRT рдХреЗ рдмрд┐рдирд╛ C++ рд╕реЗ ONNX рдореЙрдбрд▓ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред
  • рдпрд╣ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ Windows/Linux рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд╕рдВрднрд╡ рд╣реИред

ЁЯУМ рдирд┐рд╖реНрдХрд░реНрд╖

Windows ML (Microsoft.Windows.AI) рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА AI рдЕрдиреБрдорд╛рди рдЗрдВрдЬрди (inference engine) рд╣реИ рдЬрд┐рд╕реЗ C++ рд╕реЗ рдордЬрд╝рдмреВрддреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ Windows рдкрд░ рдиреЗрдЯрд┐рд╡ рдЕрдиреБрдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдБред

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ ONNX рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдФрд░ Tensor рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рд┐рдП, рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ!

comments powered by Disqus
рдирд┐рд░реНрдорд┐рдд Hugo рдХреЗ рд╕рд╛рде
рдереАрдо Stack рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ Jimmy