class_docstr: Auxiliary data structure responsible for running asynchronous all-reduce
  :param part_shapes: a sequence of shapes of torch tensors that will be averaged by this reducer
  :param num_senders: total number of peers in a given all-reduce group that will send gradients
  :note: even if local peer is not sending data, local parts will be used for shape information
class_docstr_tok: ["Auxiliary","data","structure","responsible","for","running","asynchronous","all-reduce",":","param","part_shapes",":","a","sequence","of","shapes","of","torch","tensors","that","will","be","averaged","by","this","reducer",":","param","num_senders",":","total","number","of","peers","in","a","given","all-reduce","group","that","will","send","gradients",":","note",":","even","if","local","peer","is","not","sending","data",",","local","parts","will","be","used","for","shape","information"]
code: def check_current_part_finished(self):
      assert (
          self.current_part_accumulated_from <= self.num_current_senders
      )
      if self.current_part_accumulated_from == self.num_current_senders:
          self.current_part_future.set_result(
              self.accumulator.div_(self.denominator)
          )
          self.reset_accumulators()
  
imports: import asyncio
  from collections import deque
  from typing import AsyncIterable, AsyncIterator, Optional, Sequence, Tuple, TypeVar
  import numpy
  import torch
  from hivemind.compression import CompressionBase, CompressionInfo, NoCompression
  from hivemind.proto import runtime_pb2
  from hivemind.utils import amap_in_executor, as_aiter, get_logger
label_desc: Use image node_id 4 for calling the TensorPartReducer obj's underlying member method code with example usage: obj.check_current_part_finished() without return types