evalscope 0.16.2__py3-none-any.whl → 0.17.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of evalscope might be problematic. Click here for more details.
- evalscope/app/app.py +9 -762
- evalscope/app/constants.py +1 -0
- evalscope/app/ui/__init__.py +20 -0
- evalscope/app/ui/app_ui.py +52 -0
- evalscope/app/ui/multi_model.py +323 -0
- evalscope/app/ui/sidebar.py +42 -0
- evalscope/app/ui/single_model.py +202 -0
- evalscope/app/ui/visualization.py +36 -0
- evalscope/app/utils/data_utils.py +178 -0
- evalscope/app/utils/localization.py +221 -0
- evalscope/app/utils/text_utils.py +119 -0
- evalscope/app/utils/visualization.py +91 -0
- evalscope/backend/opencompass/backend_manager.py +2 -1
- evalscope/backend/rag_eval/backend_manager.py +2 -1
- evalscope/backend/rag_eval/utils/embedding.py +1 -1
- evalscope/backend/vlm_eval_kit/backend_manager.py +4 -1
- evalscope/benchmarks/__init__.py +15 -1
- evalscope/benchmarks/aime/aime24_adapter.py +2 -1
- evalscope/benchmarks/aime/aime25_adapter.py +2 -1
- evalscope/benchmarks/alpaca_eval/alpaca_eval_adapter.py +1 -1
- evalscope/benchmarks/arc/arc_adapter.py +1 -1
- evalscope/benchmarks/arena_hard/arena_hard_adapter.py +1 -1
- evalscope/benchmarks/arena_hard/utils.py +0 -12
- evalscope/benchmarks/ceval/ceval_adapter.py +5 -16
- evalscope/benchmarks/cmmlu/cmmlu_adapter.py +9 -21
- evalscope/benchmarks/competition_math/competition_math_adapter.py +2 -1
- evalscope/benchmarks/data_adapter.py +20 -5
- evalscope/benchmarks/general_arena/__init__.py +0 -0
- evalscope/benchmarks/general_arena/general_arena_adapter.py +411 -0
- evalscope/benchmarks/general_arena/utils.py +226 -0
- evalscope/benchmarks/general_mcq/general_mcq_adapter.py +1 -1
- evalscope/benchmarks/general_qa/general_qa_adapter.py +42 -29
- evalscope/benchmarks/hellaswag/hellaswag_adapter.py +1 -1
- evalscope/benchmarks/ifeval/ifeval_adapter.py +2 -4
- evalscope/benchmarks/iquiz/iquiz_adapter.py +1 -1
- evalscope/benchmarks/live_code_bench/live_code_bench_adapter.py +0 -6
- evalscope/benchmarks/maritime_bench/maritime_bench_adapter.py +1 -1
- evalscope/benchmarks/math_500/math_500_adapter.py +2 -1
- evalscope/benchmarks/mmlu/mmlu_adapter.py +1 -1
- evalscope/benchmarks/mmlu_pro/mmlu_pro_adapter.py +1 -1
- evalscope/benchmarks/mmlu_redux/mmlu_redux_adapter.py +1 -1
- evalscope/benchmarks/musr/musr_adapter.py +1 -1
- evalscope/benchmarks/race/race_adapter.py +1 -1
- evalscope/benchmarks/trivia_qa/trivia_qa_adapter.py +9 -4
- evalscope/benchmarks/utils.py +1 -2
- evalscope/benchmarks/winogrande/winogrande_adapter.py +1 -1
- evalscope/config.py +8 -123
- evalscope/evaluator/evaluator.py +15 -12
- evalscope/metrics/__init__.py +6 -0
- evalscope/{utils/utils.py → metrics/completion_parsers.py} +68 -180
- evalscope/metrics/llm_judge.py +105 -20
- evalscope/metrics/metrics.py +1 -1
- evalscope/models/adapters/base_adapter.py +0 -2
- evalscope/models/adapters/server_adapter.py +2 -2
- evalscope/models/custom/dummy_model.py +3 -3
- evalscope/perf/arguments.py +2 -16
- evalscope/perf/main.py +1 -1
- evalscope/perf/utils/analysis_result.py +24 -23
- evalscope/perf/utils/benchmark_util.py +1 -1
- evalscope/report/__init__.py +1 -1
- evalscope/report/utils.py +34 -15
- evalscope/run.py +1 -1
- evalscope/summarizer.py +1 -2
- evalscope/utils/__init__.py +63 -2
- evalscope/utils/argument_utils.py +64 -0
- evalscope/utils/import_utils.py +16 -0
- evalscope/utils/io_utils.py +45 -4
- evalscope/utils/model_utils.py +37 -1
- evalscope/version.py +2 -2
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/METADATA +55 -26
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/RECORD +90 -101
- tests/aigc/test_t2i.py +1 -1
- tests/cli/test_all.py +50 -2
- tests/cli/test_collection.py +1 -1
- tests/cli/test_custom.py +261 -0
- tests/cli/test_run.py +13 -37
- tests/perf/test_perf.py +2 -2
- tests/rag/test_clip_benchmark.py +2 -1
- tests/rag/test_mteb.py +3 -1
- tests/rag/test_ragas.py +3 -1
- tests/swift/test_run_swift_eval.py +2 -1
- tests/swift/test_run_swift_vlm_eval.py +2 -1
- tests/swift/test_run_swift_vlm_jugde_eval.py +2 -1
- tests/utils.py +13 -0
- tests/vlm/test_vlmeval.py +8 -2
- evalscope/evaluator/rating_eval.py +0 -157
- evalscope/evaluator/reviewer/__init__.py +0 -1
- evalscope/evaluator/reviewer/auto_reviewer.py +0 -391
- evalscope/registry/__init__.py +0 -1
- evalscope/registry/config/cfg_arena.yaml +0 -77
- evalscope/registry/config/cfg_arena_zhihu.yaml +0 -63
- evalscope/registry/config/cfg_pairwise_baseline.yaml +0 -83
- evalscope/registry/config/cfg_single.yaml +0 -78
- evalscope/registry/data/prompt_template/lmsys_v2.jsonl +0 -8
- evalscope/registry/data/prompt_template/prompt_templates.jsonl +0 -8
- evalscope/registry/data/qa_browser/battle.jsonl +0 -634
- evalscope/registry/data/qa_browser/category_mapping.yaml +0 -10
- evalscope/registry/data/question.jsonl +0 -80
- evalscope/registry/tasks/arc.yaml +0 -28
- evalscope/registry/tasks/bbh.yaml +0 -26
- evalscope/registry/tasks/bbh_mini.yaml +0 -26
- evalscope/registry/tasks/ceval.yaml +0 -27
- evalscope/registry/tasks/ceval_mini.yaml +0 -26
- evalscope/registry/tasks/cmmlu.yaml +0 -27
- evalscope/registry/tasks/eval_qwen-7b-chat_v100.yaml +0 -28
- evalscope/registry/tasks/general_qa.yaml +0 -27
- evalscope/registry/tasks/gsm8k.yaml +0 -29
- evalscope/registry/tasks/mmlu.yaml +0 -29
- evalscope/registry/tasks/mmlu_mini.yaml +0 -27
- evalscope/run_arena.py +0 -202
- evalscope/utils/arena_utils.py +0 -217
- evalscope/utils/completion_parsers.py +0 -82
- /evalscope/{utils → benchmarks}/filters.py +0 -0
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/LICENSE +0 -0
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/WHEEL +0 -0
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/entry_points.txt +0 -0
- {evalscope-0.16.2.dist-info → evalscope-0.17.0.dist-info}/top_level.txt +0 -0
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
文本生成: ['写作', '续写生成', '通用写作', '应用文写作', '头脑风暴', '开放对话', '角色扮演']
|
|
2
|
-
文本理解:
|
|
3
|
-
['文本点评', '文本摘要', '润色/纠错', '文本分类', '情感分析', '信息抽取', '文本聚类', '序列处理']
|
|
4
|
-
知识问答: ['百科知识问答']
|
|
5
|
-
数学解题: ['数学解题']
|
|
6
|
-
逻辑推理: ['逻辑推理', '阅读理解']
|
|
7
|
-
CODING: ['CODING', '表格处理']
|
|
8
|
-
翻译: ['翻译']
|
|
9
|
-
安全风险: ['有伤害性']
|
|
10
|
-
其他: ['*']
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
{"question_id": 1, "text": "How can I improve my time management skills?", "category": "generic"}
|
|
2
|
-
{"question_id": 2, "text": "What are the most effective ways to deal with stress?", "category": "generic"}
|
|
3
|
-
{"question_id": 3, "text": "What are the main differences between Python and JavaScript programming languages?", "category": "generic"}
|
|
4
|
-
{"question_id": 4, "text": "How can I increase my productivity while working from home?", "category": "generic"}
|
|
5
|
-
{"question_id": 5, "text": "Can you explain the basics of quantum computing?", "category": "generic"}
|
|
6
|
-
{"question_id": 6, "text": "What are the differences between plant-based and animal-based protein sources?", "category": "generic"}
|
|
7
|
-
{"question_id": 7, "text": "How can I develop my critical thinking skills?", "category": "generic"}
|
|
8
|
-
{"question_id": 8, "text": "What are the major challenges faced by the education sector today?", "category": "generic"}
|
|
9
|
-
{"question_id": 9, "text": "What are the primary factors that influence consumer behavior?", "category": "generic"}
|
|
10
|
-
{"question_id": 10, "text": "What are the most effective strategies for conflict resolution in the workplace?", "category": "generic"}
|
|
11
|
-
{"question_id": 11, "text": "What are some potential implications of using a single-use plastic bottle versus a reusable bottle on both the environment and human health?", "category": "knowledge"}
|
|
12
|
-
{"question_id": 12, "text": "What factors would you consider when designing an inclusive and accessible public transportation system?", "category": "knowledge"}
|
|
13
|
-
{"question_id": 13, "text": "How can governments utilize fiscal and monetary policies to combat economic recessions?", "category": "knowledge"}
|
|
14
|
-
{"question_id": 14, "text": "How do language and cultural barriers affect the way people communicate and form relationships in multicultural societies?", "category": "knowledge"}
|
|
15
|
-
{"question_id": 15, "text": "Describe a scenario where artificial intelligence could be used to improve the quality and efficiency of healthcare delivery.", "category": "knowledge"}
|
|
16
|
-
{"question_id": 16, "text": "Explain the process of gene editing using CRISPR-Cas9 technology, and discuss its potential applications and ethical implications.", "category": "knowledge"}
|
|
17
|
-
{"question_id": 17, "text": "How do vaccinations work to protect individuals and communities from infectious diseases, and what is herd immunity?", "category": "knowledge"}
|
|
18
|
-
{"question_id": 18, "text": "How do social media platforms influence the way people consume and share news, and what are the potential implications for the spread of misinformation?", "category": "knowledge"}
|
|
19
|
-
{"question_id": 19, "text": "How do cultural, social, and economic factors influence people's food choices, and how can this knowledge be used to promote healthier diets?", "category": "knowledge"}
|
|
20
|
-
{"question_id": 20, "text": "Explain the process of natural selection and how it contributes to the evolution and adaptation of species.", "category": "knowledge"}
|
|
21
|
-
{"question_id": 21, "text": "How would you introduce yourself as a medieval knight at a royal banquet?", "category": "roleplay"}
|
|
22
|
-
{"question_id": 22, "text": "As a pirate captain, what would you say to your crew to motivate them to search for hidden treasure?", "category": "roleplay"}
|
|
23
|
-
{"question_id": 23, "text": "If you were a Shakespearean character, how would you declare your love for someone in a soliloquy?", "category": "roleplay"}
|
|
24
|
-
{"question_id": 24, "text": "As a superhero, how would you explain your origin story to a curious child?", "category": "roleplay"}
|
|
25
|
-
{"question_id": 25, "text": "Imagine you are a time traveler from the year 3000. What technological advancements would you tell people about?", "category": "roleplay"}
|
|
26
|
-
{"question_id": 26, "text": "As a sports commentator, describe the winning play in the final seconds of a championship game.", "category": "roleplay"}
|
|
27
|
-
{"question_id": 27, "text": "Pretend to be a world-famous chef. How would you describe your signature dish to a panel of judges?", "category": "roleplay"}
|
|
28
|
-
{"question_id": 28, "text": "You are a mountain climber reaching the summit of Mount Everest. Describe your emotions and the view from the top.", "category": "roleplay"}
|
|
29
|
-
{"question_id": 29, "text": "As a space colonist on Mars, describe your daily life and the challenges you face living on another planet.", "category": "roleplay"}
|
|
30
|
-
{"question_id": 30, "text": "Pretend to be a character in a post-apocalyptic world. Describe how you survive and the allies you encounter.", "category": "roleplay"}
|
|
31
|
-
{"question_id": 31, "text": "How can you determine if a restaurant is popular among locals or mainly attracts tourists, and why might this information be useful?", "category": "common-sense"}
|
|
32
|
-
{"question_id": 32, "text": "What are some subtle clues that suggest someone is pretending to understand a topic or conversation when they are actually confused or uninformed?", "category": "common-sense"}
|
|
33
|
-
{"question_id": 33, "text": "Why might someone choose to use a paper map or ask for directions instead of relying on a GPS device or smartphone app?", "category": "common-sense"}
|
|
34
|
-
{"question_id": 34, "text": "How can you determine if a person is genuinely interested in a conversation or simply being polite?", "category": "common-sense"}
|
|
35
|
-
{"question_id": 35, "text": "Why might someone prefer to shop at a small, locally-owned business instead of a large chain store, even if the prices are higher?", "category": "common-sense"}
|
|
36
|
-
{"question_id": 36, "text": "How can you assess the credibility of a source of information, such as a news article or blog post, without relying solely on the reputation of the author or publisher?", "category": "common-sense"}
|
|
37
|
-
{"question_id": 37, "text": "Why do some people enjoy the sensation of being scared, such as by watching horror movies or going on roller coasters, while others avoid these experiences?", "category": "common-sense"}
|
|
38
|
-
{"question_id": 38, "text": "How can observing the behavior of other people in a social situation provide clues about cultural norms and expectations?", "category": "common-sense"}
|
|
39
|
-
{"question_id": 39, "text": "Do we have a moral obligation to explore space, or should we focus on solving Earth's problems first?", "category": "common-sense"}
|
|
40
|
-
{"question_id": 40, "text": "In a world where automation is becoming increasingly prevalent, is it more important to prioritize job creation or technological progress?", "category": "common-sense"}
|
|
41
|
-
{"question_id": 41, "text": "How many times does the average human blink in a lifetime? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
42
|
-
{"question_id": 42, "text": "How many atoms are in a grain of salt? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
43
|
-
{"question_id": 43, "text": "How many lightning strikes occur on Earth each day? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
44
|
-
{"question_id": 44, "text": "How many balloons would it take to lift a house like in the movie \"Up\"? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
45
|
-
{"question_id": 45, "text": "How many text messages are sent globally in a minute? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
46
|
-
{"question_id": 46, "text": "How many words are spoken daily on Earth? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
47
|
-
{"question_id": 47, "text": "How many snowflakes fall during a typical winter? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
48
|
-
{"question_id": 48, "text": "How many pages are in all the books ever written? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
49
|
-
{"question_id": 49, "text": "How many times has the Earth orbited the Sun since the beginning of life? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
50
|
-
{"question_id": 50, "text": "How many songs have been recorded throughout history? Try to explain your answer. Your explanation should take the reader through your reasoning step-by-step.", "category": "fermi"}
|
|
51
|
-
{"question_id": 51, "text": "What if the Internet had been invented during the Renaissance period?", "category": "counterfactual"}
|
|
52
|
-
{"question_id": 52, "text": "What if the Aztecs had successfully repelled the Spanish conquistadors?", "category": "counterfactual"}
|
|
53
|
-
{"question_id": 53, "text": "What if the Black Death had not occurred in the 14th century?", "category": "counterfactual"}
|
|
54
|
-
{"question_id": 54, "text": "What if Isaac Newton had focused on biology instead of physics?", "category": "counterfactual"}
|
|
55
|
-
{"question_id": 55, "text": "What if the Beatles had never formed as a band?", "category": "counterfactual"}
|
|
56
|
-
{"question_id": 56, "text": "What if Alan Turing had not cracked the Enigma code during World War II?", "category": "counterfactual"}
|
|
57
|
-
{"question_id": 57, "text": "What if the Suez Canal had never been constructed?", "category": "counterfactual"}
|
|
58
|
-
{"question_id": 58, "text": "What if the Maya civilization had never mysteriously collapsed?", "category": "counterfactual"}
|
|
59
|
-
{"question_id": 59, "text": "What if Christopher Columbus had not discovered the Americas?", "category": "counterfactual"}
|
|
60
|
-
{"question_id": 60, "text": "What if Vincent van Gogh had been a successful artist during his lifetime?", "category": "counterfactual"}
|
|
61
|
-
{"question_id": 61, "text": "Develop a C++ program that reads a text file line by line and counts the number of occurrences of a specific word in the file.", "category": "coding"}
|
|
62
|
-
{"question_id": 62, "text": "Implement a Python function to find the longest common subsequence of two input strings using dynamic programming.", "category": "coding"}
|
|
63
|
-
{"question_id": 63, "text": "Implement a regular expression in Python to validate an email address.", "category": "coding"}
|
|
64
|
-
{"question_id": 64, "text": "Write a program to find the nth Fibonacci number using dynamic programming.", "category": "coding"}
|
|
65
|
-
{"question_id": 65, "text": "Implement a binary search algorithm to find a specific element in a sorted array.", "category": "coding"}
|
|
66
|
-
{"question_id": 66, "text": "Implement a queue data structure using two stacks in Python.", "category": "coding"}
|
|
67
|
-
{"question_id": 67, "text": "Implement a program to find the common elements in two arrays without using any extra data structures.", "category": "coding"}
|
|
68
|
-
{"question_id": 68, "text": "Given that f(x) = 5x^3 - 2x + 3, find the value of f(2).", "category": "math"}
|
|
69
|
-
{"question_id": 69, "text": "Solve for x in the equation 3x + 10 = 5(x - 2).", "category": "math"}
|
|
70
|
-
{"question_id": 70, "text": "If the endpoints of a line segment are (2, -2) and (10, 4), what is the length of the segment?", "category": "math"}
|
|
71
|
-
{"question_id": 71, "text": "Can you help me write a formal email to a potential business partner proposing a joint venture?", "category": "writing"}
|
|
72
|
-
{"question_id": 72, "text": "Can you help me write a resignation letter to my current employer, while leaving on good terms and expressing gratitude for the opportunities provided?", "category": "writing"}
|
|
73
|
-
{"question_id": 73, "text": "Use an appropriate format to structure a formal letter of recommendation for a student applying to a prestigious graduate program in computer science.", "category": "writing"}
|
|
74
|
-
{"question_id": 74, "text": "Write a compelling product launch announcement email to inform our customers of our new software solution.", "category": "writing"}
|
|
75
|
-
{"question_id": 75, "text": "Draft an apology email to a customer who experienced a delay in their order, and provide reassurance that the issue has been resolved.", "category": "writing"}
|
|
76
|
-
{"question_id": 76, "text": "Write a script for a YouTube video exploring the history and cultural significance of jazz.", "category": "writing"}
|
|
77
|
-
{"question_id": 77, "text": "Compose an engaging travel blog post about a recent trip to Hawaii, highlighting cultural experiences and must-see attractions.", "category": "writing"}
|
|
78
|
-
{"question_id": 78, "text": "Write a captivating movie review for a recently released science fiction film, discussing its plot, characters, and special effects.", "category": "writing"}
|
|
79
|
-
{"question_id": 79, "text": "Structure a podcast script for an episode discussing the influence of streaming platforms on the music industry.", "category": "writing"}
|
|
80
|
-
{"question_id": 80, "text": "Write a symphony concert review, discussing the orchestra's performance and overall audience experience.", "category": "writing"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args:
|
|
18
|
-
arc:
|
|
19
|
-
prompt_template: 'The following are multiple choice questions, please output correct answer in the form of A or B or C or D, do not output explanation:'
|
|
20
|
-
dry_run: false
|
|
21
|
-
model: null # Note: to be implemented as CustomModel
|
|
22
|
-
eval_type: custom
|
|
23
|
-
datasets:
|
|
24
|
-
- arc
|
|
25
|
-
use_cache: false
|
|
26
|
-
stage: all
|
|
27
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
28
|
-
limit: null
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- bbh
|
|
23
|
-
use_cache: false
|
|
24
|
-
stage: all
|
|
25
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
26
|
-
limit: null
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {'bbh': {'subset_list': ['temporal_sequences', 'multistep_arithmetic_two']}}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- bbh
|
|
23
|
-
use_cache: false
|
|
24
|
-
stage: all
|
|
25
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
26
|
-
limit: null
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- ceval
|
|
23
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
24
|
-
use_cache: false
|
|
25
|
-
stage: all
|
|
26
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
27
|
-
limit: null
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {'ceval': {'subset_list': ['computer_network', 'operating_system']}}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- ceval
|
|
23
|
-
use_cache: false
|
|
24
|
-
stage: all
|
|
25
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
26
|
-
limit: null
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- cmmlu
|
|
23
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
24
|
-
use_cache: false
|
|
25
|
-
stage: all
|
|
26
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
27
|
-
limit: null
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: v1.0.0
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- arc
|
|
23
|
-
- gsm8k
|
|
24
|
-
outputs: ./outputs/eval_qwen-7b-chat_v100 # Directory to save the outputs, structure: logs, predictions, reviews, reports
|
|
25
|
-
use_cache: false
|
|
26
|
-
stage: all
|
|
27
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
28
|
-
limit: 10
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: true
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- general_qa
|
|
23
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
24
|
-
use_cache: false
|
|
25
|
-
stage: all
|
|
26
|
-
dataset_hub: Local # `Local` or `ModelScope`
|
|
27
|
-
limit: null
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args:
|
|
18
|
-
gsm8k:
|
|
19
|
-
few_shot_num: 0
|
|
20
|
-
dry_run: false
|
|
21
|
-
model: null # Note: to be implemented as CustomModel
|
|
22
|
-
eval_type: custom
|
|
23
|
-
datasets:
|
|
24
|
-
- gsm8k
|
|
25
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
26
|
-
use_cache: false
|
|
27
|
-
stage: all
|
|
28
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
29
|
-
limit: null
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args:
|
|
18
|
-
mmlu:
|
|
19
|
-
few_shot_num: 0
|
|
20
|
-
dry_run: false
|
|
21
|
-
model: null # Note: to be implemented as CustomModel
|
|
22
|
-
eval_type: custom
|
|
23
|
-
datasets:
|
|
24
|
-
- mmlu
|
|
25
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
26
|
-
use_cache: true
|
|
27
|
-
stage: all
|
|
28
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
29
|
-
limit: null
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
model_args: # model args should be followed by benchmark requirements
|
|
2
|
-
revision: master
|
|
3
|
-
precision: torch.float16
|
|
4
|
-
device_map: auto
|
|
5
|
-
# model_name_or_path: qwen/qwen-7b-chat
|
|
6
|
-
generation_config:
|
|
7
|
-
temperature: 0.3
|
|
8
|
-
max_length: 2048
|
|
9
|
-
max_new_tokens: 512
|
|
10
|
-
top_k: 50
|
|
11
|
-
top_p: 0.85
|
|
12
|
-
do_sample: false
|
|
13
|
-
num_beams: 1
|
|
14
|
-
repetition_penalty: 1.0
|
|
15
|
-
# eos_token_id: null
|
|
16
|
-
# pad_token_id: null
|
|
17
|
-
dataset_args: {'mmlu': {'subset_list': ['high_school_european_history', 'business_ethics']}}
|
|
18
|
-
dry_run: false
|
|
19
|
-
model: null # Note: to be implemented as CustomModel
|
|
20
|
-
eval_type: custom
|
|
21
|
-
datasets:
|
|
22
|
-
- mmlu
|
|
23
|
-
outputs: null # structure: configs, logs, predictions, reviews, reports # TODO: need to parse
|
|
24
|
-
use_cache: false
|
|
25
|
-
stage: all
|
|
26
|
-
dataset_hub: modelscope # `Local` or `ModelScope`
|
|
27
|
-
limit: null
|
evalscope/run_arena.py
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
2
|
-
# flake8: noqa
|
|
3
|
-
|
|
4
|
-
import argparse
|
|
5
|
-
import os
|
|
6
|
-
import torch
|
|
7
|
-
from modelscope.utils.hf_util import GenerationConfig
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from tqdm import tqdm
|
|
10
|
-
|
|
11
|
-
from evalscope.constants import EvalConfigKeys
|
|
12
|
-
from evalscope.evaluator.rating_eval import RatingEvaluate
|
|
13
|
-
from evalscope.models import ChatGenerationModelAdapter
|
|
14
|
-
from evalscope.utils import get_obj_from_cfg
|
|
15
|
-
from evalscope.utils.io_utils import dump_jsonl_data, jsonl_to_list, yaml_to_dict
|
|
16
|
-
from evalscope.utils.logger import get_logger
|
|
17
|
-
|
|
18
|
-
logger = get_logger()
|
|
19
|
-
|
|
20
|
-
WORK_DIR = Path(__file__).absolute().parent
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ArenaWorkflow:
|
|
24
|
-
|
|
25
|
-
def __init__(self, cfg_file: str, **kwargs):
|
|
26
|
-
|
|
27
|
-
self.cfg_dict = yaml_to_dict(os.path.join(WORK_DIR, cfg_file))
|
|
28
|
-
logger.info(f'**Arena Config: {self.cfg_dict}')
|
|
29
|
-
|
|
30
|
-
self.question_file: str = os.path.join(WORK_DIR, self.cfg_dict.get('question_file'))
|
|
31
|
-
self.answers_gen: dict = self.cfg_dict.get('answers_gen', {})
|
|
32
|
-
self.reviews_gen: dict = self.cfg_dict.get('reviews_gen', {})
|
|
33
|
-
self.reviewer_cfg: dict = ArenaWorkflow._get_obj_from_cfg(self.reviews_gen.get('reviewer', {}))
|
|
34
|
-
|
|
35
|
-
self.prompt_file = os.path.join(WORK_DIR, self.reviews_gen.get('prompt_file'))
|
|
36
|
-
self.review_file = os.path.join(WORK_DIR, self.reviews_gen.get('review_file'))
|
|
37
|
-
|
|
38
|
-
self.rating_gen: dict = self.cfg_dict.get('rating_gen', {})
|
|
39
|
-
self.report_file: str = os.path.join(WORK_DIR, self.rating_gen.get('report_file'))
|
|
40
|
-
|
|
41
|
-
@staticmethod
|
|
42
|
-
def _get_obj_from_cfg(obj_cfg: dict):
|
|
43
|
-
cls_ref = obj_cfg.get(EvalConfigKeys.CLASS_REF, None)
|
|
44
|
-
if not cls_ref:
|
|
45
|
-
logger.warning(f'Class reference is not specified in config: {obj_cfg}')
|
|
46
|
-
return obj_cfg
|
|
47
|
-
|
|
48
|
-
cls = get_obj_from_cfg(cls_ref)
|
|
49
|
-
obj_cfg[EvalConfigKeys.CLASS_REF] = cls
|
|
50
|
-
|
|
51
|
-
return obj_cfg
|
|
52
|
-
|
|
53
|
-
def _predict_answers(self, model_id_or_path: str, model_revision: str, precision: torch.dtype,
|
|
54
|
-
generation_config: GenerationConfig, template_type: str) -> list:
|
|
55
|
-
|
|
56
|
-
# TODO: multi-task to be supported
|
|
57
|
-
model_adapter = ChatGenerationModelAdapter(
|
|
58
|
-
model_id=model_id_or_path,
|
|
59
|
-
model_revision=model_revision,
|
|
60
|
-
torch_dtype=precision,
|
|
61
|
-
generation_config=generation_config,
|
|
62
|
-
template_type=template_type)
|
|
63
|
-
res_list = []
|
|
64
|
-
questions_list = jsonl_to_list(self.question_file)
|
|
65
|
-
for data_d in tqdm(questions_list, total=len(questions_list), desc=f'Predicting(answers):'):
|
|
66
|
-
# {"question_id": 1, "text": "How can I improve my time management skills?", "category": "generic"}
|
|
67
|
-
text = data_d.get('text', None)
|
|
68
|
-
if not text:
|
|
69
|
-
logger.warning(f'Invalid question: {data_d}')
|
|
70
|
-
continue
|
|
71
|
-
prompt = f'Question: {text}\n\nAnswer:'
|
|
72
|
-
inputs = {'data': [prompt]}
|
|
73
|
-
res_d: dict = model_adapter.predict(inputs=inputs)
|
|
74
|
-
ans_text: str = res_d['choices'][0]['message']['content']
|
|
75
|
-
|
|
76
|
-
ans = {
|
|
77
|
-
'question_id': data_d['question_id'],
|
|
78
|
-
'text': data_d['text'],
|
|
79
|
-
'category': data_d['category'],
|
|
80
|
-
'model_id': model_id_or_path,
|
|
81
|
-
'metadata': {},
|
|
82
|
-
'answer': ans_text,
|
|
83
|
-
}
|
|
84
|
-
res_list.append(ans)
|
|
85
|
-
|
|
86
|
-
return res_list
|
|
87
|
-
|
|
88
|
-
def get_answers(self):
|
|
89
|
-
for model_name, cfg_d in self.answers_gen.items():
|
|
90
|
-
enable = cfg_d.get(EvalConfigKeys.ENABLE, True)
|
|
91
|
-
if not enable:
|
|
92
|
-
logger.warning(f'Skip model {model_name} because it is not enabled.')
|
|
93
|
-
continue
|
|
94
|
-
|
|
95
|
-
model_id_or_path = cfg_d.get(EvalConfigKeys.MODEL_ID_OR_PATH)
|
|
96
|
-
model_revision = cfg_d.get(EvalConfigKeys.MODEL_REVISION, None)
|
|
97
|
-
precision = cfg_d.get(EvalConfigKeys.PRECISION, torch.float16)
|
|
98
|
-
precision = eval(precision) if isinstance(precision, str) else precision
|
|
99
|
-
custom_generation_config = cfg_d.get(EvalConfigKeys.GENERATION_CONFIG, {})
|
|
100
|
-
custom_generation_config = GenerationConfig(**custom_generation_config)
|
|
101
|
-
ans_output_file = os.path.join(WORK_DIR, cfg_d.get(EvalConfigKeys.OUTPUT_FILE))
|
|
102
|
-
template_type = cfg_d.get(EvalConfigKeys.TEMPLATE_TYPE)
|
|
103
|
-
|
|
104
|
-
answers_list = self._predict_answers(
|
|
105
|
-
model_id_or_path=model_id_or_path,
|
|
106
|
-
model_revision=model_revision,
|
|
107
|
-
precision=precision,
|
|
108
|
-
generation_config=custom_generation_config,
|
|
109
|
-
template_type=template_type)
|
|
110
|
-
|
|
111
|
-
os.makedirs(os.path.dirname(ans_output_file), exist_ok=True)
|
|
112
|
-
dump_jsonl_data(answers_list, ans_output_file)
|
|
113
|
-
logger.info(f'Answers generated by model {model_name} and saved to {ans_output_file}')
|
|
114
|
-
|
|
115
|
-
def get_reviews(self, dry_run: bool = False):
|
|
116
|
-
enable = self.reviews_gen.get(EvalConfigKeys.ENABLE, True)
|
|
117
|
-
if enable:
|
|
118
|
-
reviewer_cls = self.reviewer_cfg.get(EvalConfigKeys.CLASS_REF)
|
|
119
|
-
if not reviewer_cls:
|
|
120
|
-
logger.warning('Skip reviews generation because class reference is not specified.')
|
|
121
|
-
return
|
|
122
|
-
reviewer_args = self.reviewer_cfg.get(EvalConfigKeys.CLASS_ARGS, {})
|
|
123
|
-
target_answers = self.reviews_gen.get('target_answers')
|
|
124
|
-
if target_answers is None:
|
|
125
|
-
# Get all answers from answers_gen config if target_answers is None
|
|
126
|
-
target_answers = [item[EvalConfigKeys.OUTPUT_FILE] for item in self.answers_gen.values()]
|
|
127
|
-
target_answers = [os.path.join(WORK_DIR, item) for item in target_answers]
|
|
128
|
-
target_answers = [file_path for file_path in target_answers if os.path.exists(file_path)]
|
|
129
|
-
|
|
130
|
-
baseline_file = self.reviews_gen.get('baseline_file', None)
|
|
131
|
-
if baseline_file:
|
|
132
|
-
baseline_file = os.path.join(WORK_DIR, baseline_file)
|
|
133
|
-
|
|
134
|
-
reference_file = self.reviews_gen.get('reference_file', None)
|
|
135
|
-
if reference_file:
|
|
136
|
-
reference_file = os.path.join(WORK_DIR, reference_file)
|
|
137
|
-
|
|
138
|
-
cache_file = self.reviews_gen.get('cache_file', None)
|
|
139
|
-
if cache_file:
|
|
140
|
-
cache_file = os.path.join(WORK_DIR, cache_file)
|
|
141
|
-
|
|
142
|
-
input_kwargs = dict(
|
|
143
|
-
prompt_file=self.prompt_file,
|
|
144
|
-
answer_file_list=target_answers,
|
|
145
|
-
review_result_file=self.review_file,
|
|
146
|
-
baseline_file=baseline_file,
|
|
147
|
-
reference_file=reference_file,
|
|
148
|
-
reviewer_args=reviewer_args,
|
|
149
|
-
cache_file=cache_file)
|
|
150
|
-
|
|
151
|
-
reviewer_obj = reviewer_cls(**input_kwargs)
|
|
152
|
-
reviewer_obj.run(dry_run=dry_run)
|
|
153
|
-
logger.info(f'Reviews with generated by reviewer and saved to {self.review_file}')
|
|
154
|
-
|
|
155
|
-
else:
|
|
156
|
-
logger.warning('Skip reviews generation because it is not enabled.')
|
|
157
|
-
|
|
158
|
-
def get_rating_results(self):
|
|
159
|
-
enable = self.rating_gen.get(EvalConfigKeys.ENABLE, True)
|
|
160
|
-
if enable:
|
|
161
|
-
report_file = os.path.join(WORK_DIR, self.rating_gen.get('report_file'))
|
|
162
|
-
metrics = self.rating_gen.get('metrics', ['elo'])
|
|
163
|
-
baseline_model = self.rating_gen.get('baseline_model') if metrics[0] == 'pairwise' else None
|
|
164
|
-
ae = RatingEvaluate(metrics=metrics, baseline_model=baseline_model)
|
|
165
|
-
res_list = ae.run(self.review_file)
|
|
166
|
-
rating_df = res_list[0]
|
|
167
|
-
logger.info(f'Rating results:\n{rating_df.to_csv()}')
|
|
168
|
-
os.makedirs(os.path.dirname(report_file), exist_ok=True)
|
|
169
|
-
rating_df.to_csv(report_file, index=True)
|
|
170
|
-
logger.info(f'Rating results are saved to {report_file}')
|
|
171
|
-
else:
|
|
172
|
-
logger.warning('Skip rating because it is not enabled.')
|
|
173
|
-
|
|
174
|
-
def run(self, dry_run: bool = False):
|
|
175
|
-
|
|
176
|
-
# Get all answers
|
|
177
|
-
self.get_answers()
|
|
178
|
-
|
|
179
|
-
# Get all reviews
|
|
180
|
-
self.get_reviews(dry_run=dry_run)
|
|
181
|
-
|
|
182
|
-
# Get rating results
|
|
183
|
-
self.get_rating_results()
|
|
184
|
-
|
|
185
|
-
logger.info('*** Arena workflow is finished. ***')
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def main():
|
|
189
|
-
|
|
190
|
-
# Usage: python evalscope/run_arena.py -c /path/to/xxx_cfg_arena.yaml
|
|
191
|
-
|
|
192
|
-
parser = argparse.ArgumentParser(description='LLMs evaluations with arena mode.')
|
|
193
|
-
parser.add_argument('-c', '--cfg-file', required=True)
|
|
194
|
-
parser.add_argument('--dry-run', action='store_true', default=False)
|
|
195
|
-
args = parser.parse_args()
|
|
196
|
-
|
|
197
|
-
arena_workflow = ArenaWorkflow(cfg_file=args.cfg_file)
|
|
198
|
-
arena_workflow.run(dry_run=args.dry_run)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if __name__ == '__main__':
|
|
202
|
-
main()
|