forked from openvinotoolkit/openvino.genai
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvisual_language_lora.cpp
More file actions
70 lines (59 loc) · 2.49 KB
/
visual_language_lora.cpp
File metadata and controls
70 lines (59 loc) · 2.49 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Copyright (C) 2026 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#include "load_image.hpp"
#include <openvino/core/except.hpp>
#include <openvino/genai/visual_language/pipeline.hpp>
#include <cstdlib>
#include <filesystem>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>
ov::genai::StreamingStatus print_subword(std::string&& subword) {
std::cout << subword << std::flush;
return ov::genai::StreamingStatus::RUNNING;
}
int main(int argc, char* argv[]) try {
// At least one LoRA adapter must be provided.
OPENVINO_ASSERT(argc >= 6 && ((argc - 4) % 2) == 0,
"Usage: ", argv[0],
" <MODEL_DIR> <IMAGE_FILE OR DIR_WITH_IMAGES> <PROMPT> <LORA_SAFETENSORS> <ALPHA> [<LORA_SAFETENSORS> <ALPHA> ...]",
"\nNote: device is fixed to CPU for this sample.");
std::vector<ov::Tensor> rgbs = utils::load_images(argv[2]);
const std::string device = "CPU"; // GPU can be used as well
ov::AnyMap pipeline_properties;
const std::string prompt = argv[3];
// LoRA args parsed as pairs: <LORA_SAFETENSORS> <ALPHA>
ov::genai::AdapterConfig adapter_config;
for (int idx = 4; idx + 1 < argc; idx += 2) {
ov::genai::Adapter adapter(argv[idx]);
float alpha = std::stof(argv[idx + 1]);
adapter_config.add(adapter, alpha);
}
pipeline_properties.insert({ov::genai::adapters(adapter_config)});
ov::genai::VLMPipeline pipe(argv[1], device, pipeline_properties);
ov::genai::GenerationConfig generation_config;
generation_config.max_new_tokens = 100;
std::cout << "Generating answer with LoRA adapters applied:\n";
pipe.generate(prompt,
ov::genai::images(rgbs),
ov::genai::generation_config(generation_config),
ov::genai::streamer(print_subword));
std::cout << "\n----------\nGenerating answer without LoRA adapters applied:\n";
pipe.generate(prompt,
ov::genai::images(rgbs),
ov::genai::generation_config(generation_config),
ov::genai::adapters(),
ov::genai::streamer(print_subword));
std::cout << "\n----------\n";
} catch (const std::exception& error) {
try {
std::cerr << error.what() << '\n';
} catch (const std::ios_base::failure&) {}
return EXIT_FAILURE;
} catch (...) {
try {
std::cerr << "Non-exception object thrown\n";
} catch (const std::ios_base::failure&) {}
return EXIT_FAILURE;
}