class_docstr: Partitioned PS StrategyBuilder with Greedy Load Balancer.
  
  Determine the number of partitions for each partition-able
  variable by finding its minimum divisor along the first axis.
  
  Then, use a greedy load balancer (determined by memory usage)
  to assign the partitions to Parameter Servers. This means that,
  unlike the standard PS StrategyBuilder, that a variable can be
  spread across multiple servers using this StrategyBuilder.
docstr: Gets the minimum number of shards for a variable.
docstr_tok: ["Gets","the","minimum","number","of","shards","for","a","variable","."]
code: def get_num_shards(var):
      """Gets the minimum number of shards for a variable."""
      if not var.initial_value.shape.ndims:
          return 1
  
      n = int(var.initial_value.shape[0])
      for i in range(2, n):
          if n % i > 0:
              return i
      return n
  
file_path: autodist/autodist/strategy/uneven_partition_ps_strategy.py
imports: from math import ceil
  from tensorflow.python.framework import tensor_shape
  from autodist.const import ENV
  from autodist.kernel.common.op_info import CONTROL_FLOW_OPS
  from autodist.kernel.common.utils import get_consumers, get_op_name
  from autodist.kernel.partitioner import PartitionerConfig
  from autodist.strategy.base import Strategy, StrategyBuilder
  from autodist.proto import strategy_pb2
label_desc: Use image node_id 4 for calling the UnevenPartitionedPS obj's underlying member method code with example usage: obj.get_num_shards(var) and returns: n, int, i