code: def score_corpus_multiprocess(
      self, hypothesis: List[str], references: List[List[str]]
  ) -> float:
      scorer = CHRF(get_default_args())
      if self.n_workers == 1:
          corpus_score = scorer.corpus_score(
              hypothesis, references
          ).score
      else:
          batches = list(
              self._batch(
                  hypothesis, references, n_batches=self.n_workers
              )
          )
          corpus_stats = [0 for _ in range(CHRF.ORDER * 3)]
          with ProcessPoolExecutor(
              max_workers=self.n_workers
          ) as executor:
              futures = [
                  executor.submit(_get_corpus_statistics, b[0], b[1])
                  for b in batches
              ]
              progress = as_completed(futures)
              if self.verbose:
                  progress = tqdm(progress)
              for future in progress:
                  stats = future.result()
                  for i in range(CHRF.ORDER * 3):
                      corpus_stats[i] += stats[i]
          corpus_score = scorer.compute_chrf(
              corpus_stats, scorer.order, scorer.beta
          ).score
      return corpus_score
  
file_path: vizseq/vizseq/scorers/chrf.py
imports: from concurrent.futures import ProcessPoolExecutor, as_completed
  from typing import List, Optional, Dict
  import argparse
  from sacrebleu.metrics import CHRF
  from tqdm import tqdm
  from vizseq.scorers import register_scorer, VizSeqScorer, VizSeqScore
label_desc: Use image node_id 1 for calling the ChrFScorer obj's underlying member method code with example usage: obj.score_corpus_multiprocess(hypothesis, references) and returns: corpus_score